2016-11-22 7 views
0

JPQL:制約エラー

delete from Session where deviceId=:deviceId and username=:username 

エラー:

org.hibernate.engine.jdbc.spi.SqlExceptionHelper: ERROR: update or delete on table "edge_session" violates foreign key constraint "fkh7j6o58rfwfumainodrxptobt" on table "session_contactmethods" 

Sessionクラス:

@Entity 
@Table(name="EDGE_SESSION") 
public class Session { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private long id; 

    @ElementCollection(targetClass=ContactMethod.class) 
    @Enumerated(EnumType.STRING) 
    private Set<ContactMethod> contactMethods; 

... 
} 

私はcontactMethodsフィールドに特定のCascadeTypesを追加するべきか?外国のテーブルは列挙型を保持しているので、列挙型のリストを残しておきたいので、削除はうまくいかないはずです。

EDIT:作成するsession_contactmethodsテーブルは、列挙型の値ではなく、セッションとの結合キーであるかのように見えます。

# \d session_contactmethods 
     Table "public.session_contactmethods" 
    Column  |   Type   | Modifiers 
----------------+------------------------+----------- 
session_id  | bigint     | not null 
contactmethods | character varying(255) | 
Foreign-key constraints: 
    "fkh7j6o58rfwfumainodrxptobt" FOREIGN KEY (session_id) REFERENCES edge_session(id) 

# select * from session_contactmethods; 
session_id | contactmethods 
------------+---------------- 
      1 | EMAIL 
      1 | TELEPHONE 
      2 | TELEPHONE 
      2 | EMAIL 
(4 rows) 
+0

session_contactメソッドは結合テーブルのように聞こえるのですか?またはそれは文字通りContactMethod列挙型/エンティティを保持するテーブルですか? – Gimby

+0

列挙型のリストはどのように残っていますか?それらは、セッションオブジェクトである所有者に完全に依存しています。 PSの場合、そのフィールドに "targetClass"は必要ありません。それを定義するジェネリックがあります。 –

+0

ええ、今は、別のテーブルが関わっている可能性があると思います。とにかく、私はどのように削除を動作させるのですか?追加のカスケードアノテーションが必要なのでしょうか?それは必須ではないと思いますか? – rich

答えて

2

JPAでオブジェクトを削除するには、2つの方法があります。

  1. EntityManager.remove(...)を使用してください。これはカスケード設定に応じて必要に応じてカスケードします( )。
  2. Bulk Deleteクエリを使用してください。これは、カスケードないし、あなたは基本的にを言っている

あなたは後者を選んだ「私を信頼し、私は私がやっているか知っている」、とあなたが指示し、その明白な理由のために失敗したとして、それは何しようとしますが接続されたデータです。最初のオプションを使用するか、関連するオブジェクトをまず影響を受けるセッションオブジェクトから削除してください