我需要以编程方式创建一堆对象并将它们全部持久化。同时存在1:n
,1:1
和n:n
关系。
所有关系都用 定义CascadeType.All
。
当我现在创建所有对象实例并设置它们的关系时,只有第一个persist()
操作会起作用。其他人将失败,并显示已将分离实体传递给持久化的消息。
例子:
A a1 = new A();
A a2 = new A();
A a3 = new A();
CommonB = new B();
SpecialB = new B();
Set<B> set1 = new HashSet<B>();
set1.add(CommonB);
set1.add(SpecialB);
Set<B> set2 = new HashSet<B>();
set2.add(CommonB);
a1.setBs(set1);
a2.setBs(set2);
a3.setBs(set2);
现在,我正在使用我们的数据服务来持久化 a1、a2 和 a3。(它基本上只是在实体管理器上调用persist())
第一次尝试效果很好,两者,CommonB
并且SpecialB
与a1
(关系也被创建。但是,当我尝试坚持时a2
,Hibernate 说org.hibernate.PersistentObjectException: detached entity passed to persist: my.namespace.B
类看起来像这样:
class A(){
@ManyToMany(fetch = FetchType.EAGER, cascade = { CascadeType.ALL })
@JoinTable
private Set<B> bs;
//get set
}
class B(){
@ManyToMany(fetch = FetchType.EAGER, cascade = { CascadeType.ALL }, mappedBy = "bs")
private Set<A> as;
}
该示例已被剥离,实际上n:n
5 个实体之间存在多个关系。
- - 更新
我也错过了将“As”添加到“Bs”集中:
CommonB.setAs(/* a1, a2, a3 */);
SpecialB.setAs(/* a1 */);
因此,说完整的关系是在对象级别上设置的。每当我保存其中一个对象时,实际上不Cascade.All
应该关心在某个关系组中持久化所有对象吗?
如果我给喜欢em.persist(a1)
,不应该休眠通知:
- a1 与 CommonB 和 Special B 有关。
- CommonB 又与 a2 和 a3 有关
- 所以我要保存 a1、a2、a3、CommonB 和 SpecialB。
然而这不会发生..