1

私のプロジェクトには次の構造があります。

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 がこれを処理しない理由はまだよくわかりませんが、掘り続けます。

4

0 に答える 0