2016-04-09 6 views
2

を要求することなく、DBからデータを削除します。私のコードでは、私は別名反復するループがあります。もちろんHibernateは私が<code>@ElementCollection</code>注釈を持つエンティティ<code>Customer</code>を持って削除

Hibernate: select aliases0_.customer_id as cus1_3_0_, aliases0_.aliase as ali2_0_0_ from customer_alias aliases0_ where aliases0_.customer_id=? 
Hibernate: delete from customer_alias where customer_id=? 

- 「削除」行の後:不思議な

for(String alias: customer.getAliases()) { ... } 

を、右、私はこれらの2行のログを見ると、この行の後データはDBから削除され、理由を把握できません。私のコードでどこでdeleteと呼ぶかはどこにもなく、forループの直後に起こります。 getAliases()と呼ぶと、テーブルが削除されるようです。

+1

forループには何がありますか? – Henry

+1

これはおそらくこれに関連しています:http://stackoverflow.com/questions/3742897/hibernate-elementcollection-strange-delete-insert-behavior –

+0

@Henry - 私はこの行だけをループに入れます - 'System.out.println "Test"); 'ループ内ではなくループ内で実行されるようにします。まだ起こる – Avi

答えて

0

不幸にも、投稿を読んだ後、コメントからの回答を参考にしても解決策が見つかりませんでした。私はエンティティAliasを作成し、主キーと@Idフィールドを作成して解決しました。

この回答を残しておきますが、将来的にはより良い解決策が得られることを希望します。

0

https://en.wikibooks.org/wiki/Java_Persistence/ElementCollection

からJPA 2.0仕様は 組み込みのidを定義する方法を提供しません。ただし、ElementCollectionマッピング の要素を削除または更新するには、通常は一意のキーが必要です。 それ以外の場合、JPAプロバイダは、すべての更新時に、EntityのCollectionTableからすべて を削除してから、値を に戻す必要があります。したがって、JPAプロバイダは、 埋め込み可能なフィールドのすべてのフィールドの組み合わせが、外部キー(JoinColumn(s))との組み合わせで で一意であると想定する可能性が最も高くなります。しかし、これは が非効率的であるか、または埋め込み可能ファイルが大きい場合には実現できない可能性があります。つまり、 複合ファイルです。

一部のJPAプロバイダでは、この問題を解決するために埋め込み可能な にIDを指定することを許可する場合があります。この場合、外部キーは が含まれているため、Idではコレクションでユニークにする必要があるのは です。 CollectionTable の一意のオプションを使用することもできます。そうでない場合、Embeddableが複雑な場合は、 をエンティティにしてOneToManyを代わりに使用することを検討してください。

+0

うん、それはコメントで参照されていましたが、私自身もそれを発見しました。それは問題を解決しないか、少なくとも問題を解決するために私が何を変えなければならないか理解できません。この段落やその他の回答のどちらも、不幸にも解決策を与えてくれたものはありません。/ – Avi

+0

理論的には、OneToManyが持つテーブルのマッピングがない限り、テーブル内のエントリの削除を防ぐことはできません。 OneToManyを使用するか、ElementCollectionとして同じAPIを公開するEntityクラスメソッドを記述して、OneToManyをElementCollectionとして実装することができます。私は第二の選択肢が明確であることを願う –

関連する問題