プログラムで一連のオブジェクトを作成し、それらすべてを永続化する必要があります。1:n
、1:1
および関係がn:n
同時に関係しています。
すべての関係は で定義されCascadeType.All
ます。
すべてのオブジェクト インスタンスを作成してそれらの関係を設定すると、最初のpersist()
操作だけが機能します。他のものは、切り離されたエンティティが持続するために渡されたというメッセージで失敗します。
例:
A a1 = new A();
A a2 = new A();
A a3 = new A();
CommonB = new B();
SpecialB = new B();
Set<B> set1 = new HashSet<B>();
set1.add(CommonB);
set1.add(SpecialB);
Set<B> set2 = new HashSet<B>();
set2.add(CommonB);
a1.setBs(set1);
a2.setBs(set2);
a3.setBs(set2);
今、私はデータサービスを使用してa1、a2、およびa3を永続化しています。(基本的には、entitymanager で persist() を呼び出すだけです)
CommonB
最初の試みは両方ともうまく機能し、SpecialB
一緒に永続化a1
されます (関係も作成されます。ただし、永続化しようとするa2
と、Hibernate は言いますorg.hibernate.PersistentObjectException: detached entity passed to persist: my.namespace.B
クラスは次のようになります。
class A(){
@ManyToMany(fetch = FetchType.EAGER, cascade = { CascadeType.ALL })
@JoinTable
private Set<B> bs;
//get set
}
class B(){
@ManyToMany(fetch = FetchType.EAGER, cascade = { CascadeType.ALL }, mappedBy = "bs")
private Set<A> as;
}
この例は簡略化されており、実際にはn:n
5 つのエンティティ間に複数の関係があります。
- - アップデート
「Bs」セットにも「As」を追加するのを逃しました。
CommonB.setAs(/* a1, a2, a3 */);
SpecialB.setAs(/* a1 */);
したがって、完全なリレーションはオブジェクト レベルで設定されていると言えます。Cascade.All
それらのオブジェクトの 1 つを保存するたびに、特定のリレーション群内のすべてのオブジェクトを永続化することを実際に処理する必要はありませんか?
私が好きなようem.persist(a1)
に与えた場合、通知を休止状態にすべきではありません:
- a1 は CommonB と Special B に関連しています。
- CommonB は a2 と a3 に関連しています。
- だから私はa1、a2、a3、CommonB、SpecialBを保存しています。
しかし、それは起こりません..