0

我需要以编程方式创建一堆对象并将它们全部持久化。同时存在1:n,1:1n: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并且SpecialBa1(关系也被创建。但是,当我尝试坚持时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:n5 个实体之间存在多个关系。

- - 更新

我也错过了将“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。

然而这不会发生..

4

1 回答 1

2

当您 persista1时,它还会将CommonBid 持久化并设置到该对象中。Persisting将在已持久化一次后a2尝试 再次持久化。CommonB我假设您的数据服务是事务性的,因此在持久化后a1它会关闭 TX 和 Hibernate 的会话然后CommonB变成一个分离的对象。CommonB持久化时需要重新加载(重新附加)a2a3.

于 2013-09-11T09:19:44.297 回答