hibernate中的传递持久性顺序

时间:2011-12-02 21:54:09

标签: java hibernate jpa

我有2个父类A,C和2个子类:B,D。两个关系都启用了传递持久性。但是持久的D要求B持久。

class A {
    @OneToMany(cascade = {CascadeType.PERSIST}, mappedBy = "a")
    public Set<B> getBs() {
     ...
    }
}

class B {
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "a_id", nullable = false)
    public A getA() {
      ...
    }
}

class C {
    @OneToMany(cascade = {CascadeType.PERSIST}, mappedBy = "c")
    public Set<D> getDs() {
       ...
    }
}

class D {
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "b_id", nullable = false)
    public B getB() {
      ...
    }

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "c_id", nullable = false)
    public C getC() {
      ...
    }
}

我想要的是一次性保存B和D:

A a = entityManager.getReference(...);
C c = entityManager.getReference(...);

B b = new B();

D d = new D();
d.setB(b);

a.add(b);
b.setA(a);

c.add(d);
d.setC(c);

entityManager.flush();

我认为这应该是可能的。但是我得到一个TransientObjectException,告诉B在尝试保存D时需要持久化。

hibernate处理级联关系是否有特定的顺序?

1 个答案:

答案 0 :(得分:2)

当你冲洗时,由于从C到D的级联,d变得持久。但是从D到B没有级联,所以Hibernate抱怨。 A需要在D之前刷新才能工作,但是没有理由在A和D之间有任何特定的顺序。

相关问题