我的项目中有以下结构:
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 级联不会为我处理这个问题,但会继续挖掘。