多个字段的休眠级联顺序 - 对象引用未保存的瞬态实例



我有以下实体

class A {
    @OneToMany(cascade = ALL)
    List<B> b;
    @OneToMany(cascade = ALL)
    List<C> c;
}
class B {
    @ManyToOne
    A a
}
class C {
    @ManyToOne
    A a;
    @ManyToOne
    B b;
}

现在,当我在事务中执行以下代码时

A a = repository.findOne(id);
B b = new B();
C c = new C();
c.setB(b);
a.addB(b);
a.addC(c);
repository.save(a);

我从休眠中得到以下异常:

object references an unsaved transient instance - save the transient instance before flushing

如果我在添加b后保存a,我的代码就可以工作,因为这样bc之前保存。

我猜持久性级联的顺序很重要。有什么方法可以确保 b 在 c 之前级联?

我可能是错的,但我认为不可能确保您的 B 列表首先级联,无论如何这不是最佳实践。

我认为您最简单的选择是将级联持久添加到从 C 到 B 的关系中。

class C {
    @ManyToOne
    A a;
    @ManyToOne(cascade = PERSIST)
    B b;
}

最新更新