所有者エンティティは、それらへの参照を失ったとき、なぜJPAは、所有するエンティティを削除しないのだろうか?
-
16-09-2019 - |
質問
私は回答(また、JPAエンティティ)のリストを所有しているJPAエンティティ「Request」を、持っています。ここでは、Request.javaで定義されています方法は次のとおりです。
@OneToMany(cascade= CascadeType.ALL, mappedBy="request")
private List<Answer> answerList;
そしてAnswer.javaでます:
@JoinColumn(name = "request", referencedColumnName="id")
@ManyToOne(optional = false)
private Request request;
は、プログラム実行の過程で、回答のリクエストの一覧は、回答追加されているか、あるいはそれから削除、または実際のListオブジェクトを置き換えることができます。私の問題は、このようにある:私は、データベースへのリクエストをマージするとき、を回答オブジェクトを使用のリストにあるようにデータベースに保存されている - つまり、要求はもはやA保持しているオブジェクトを回答します(一覧を介して間接的に)への参照が削除されません。
これは私がデータベースへのリクエストをマージするかのように、私が望む動作ではありませんし、再度それをフェッチする、その回答の一覧は同じではないかもしれません。私はいくつかのプログラミング間違っているのでしょうか?データベース内に回答リクエストの一覧に正確に回答していることが保証されます注釈や設定はありますか?
ソリューションは、リクエストをマージする前に、各古い回答を削除するためにEntityManagerを使用し、その後、元の回答リストへの参照を維持することですが、きれいな方法があるはずのように思える。
解決
JPA 1.0では、何をやりたいがJPAで行うことはできません。単純に、すべてのリレーションシップ・マネジメントは、(あなたが何をしようとしてである)のコレクションからすべての孤児を削除など、アプリケーションによって行われる必要があります。
JPA 2.0では、彼らは(私は詳細を知らないが)のサポートを行いますが、あなたの実装に応じて、アップグレードが簡単か、できないことがあります。
また、私はどちらかそれについての詳細を提供することができないなど、直接Hibernateのようなものを使用していますが、まだ多くのJPA 1.0のアノテーションを使用することができます。
私の場合は、リフレクション経由で自動的にコレクションのマージ処理するための汎用的なコードを書いています。
他のヒント
のEclipseLinkを使用してanswerListに@PrivateOwned注釈が役立つだろう入れます。
これは、マッピングされた関係で追加のプロパティを指定することは違法です。 代わりに、要求に@DependentElementアノテーションを使用することができます。
あなたはJPAプロバイダとしてHibernateはを使用する場合は、追加することができます。
@Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
answerListに。これは、あなたがすでにそこに使用JPA注釈のほかに働くだろう。 JPA 2(ほとんど/すべてのJPAプロバイダは、この時点での生産準備の実装を持っていない)自分自身でこれを行うことができます。