私のプロジェクトには次の構造があります。
public class A {
@Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE, org.hibernate.annotations.CascadeType.PERSIST,
org.hibernate.annotations.CascadeType.REFRESH, org.hibernate.annotations.CascadeType.MERGE})
@OneToMany(fetch = FetchType.LAZY)
@JoinColumn(name = "a_id")
private List<B> bs;
}
public class B {
@Cascade(org.hibernate.annotations.CascadeType.ALL)
@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name = "b_id")
private C c;
}
public class C {
@ManyToMany(fetch = FetchType.EAGER, targetEntity = TjenesteFraIN.class,
cascade = { CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH})
@JoinTable(name = "c_d",
joinColumns = @JoinColumn(name = "c_id"),
inverseJoinColumns = @JoinColumn(name = "d_id"))
private List<D> ds;
}
public class D {
...
}
次に、切り離された A オブジェクトがあり、切り離された B オブジェクトへの参照があり、そのオブジェクトが切り離された C オブジェクトへの参照を持ち、それがいくつかの D オブジェクトへの参照を持っているシーンです。(私は JMS を使用しているので、それらは本当に切り離されています)。このような:
final A a = getA(123); //load A-object from database
final C c = a.getSpecialC();
c.addD(getD(1)); //get Ds from database
c.addD(getD(2));
//Serialize A and send JMS-call to store the A
//On the other side, deserialize A, and then call
public A mergeA(final A a) {
return getSession(false).merge(a);
}
ここで、分離された A は A のデータベース表現とマージされます。B と C についても同様ですが、C から D への新しい参照はどうなるでしょうか? c_d 接続テーブルには何も保存されていませんが、その理由がわかりません。Hibernate/JPA の制限によるものですか、それとも設定に関して何か不足していますか?
アップデート:
デバッガーを使用することで、C オブジェクトに対して明示的な getSession().merge() を実行でき、D への参照がデータベースに格納されました。Hibernate cascade がこれを処理しない理由はまだよくわかりませんが、掘り続けます。