我的项目中有以下结构:
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对象的scenerio,引用了一个分离的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引用到Ds的新内容会发生什么?我在实践中看到它不起作用,没有任何东西存储在c_d连接表中,但我不明白为什么。是因为Hibernate / JPA的限制,还是我遗漏了一些与我的配置有关的东西?
更新
通过使用调试器,我能够在C对象上显式getSession()。merge(),然后它对D的引用存储在数据库中。仍然不太明白为什么Hibernate级联不会为我解决这个问题,但会继续挖掘。