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 对象,而 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 级联不会为我处理这个问题,但会继续挖掘。

4

0 回答 0