多个字段的 Hibernate 级联顺序 - 对象引用未保存的瞬态实例
Hibernate cascading order for multiple fields - object references an unsaved transient instance
我有以下实体
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
,我的代码就可以工作,因为 b
在 c
之前保存。
我猜持久层级联的顺序很重要。有什么方法可以确保 b 在 c 之前级联吗?
我可能错了,但我认为不可能确保首先级联你的 B 列表,无论如何这都不是最佳做法。
我认为最简单的选择是将级联持久化添加到从 C 到 B 的关系中。
class C {
@ManyToOne
A a;
@ManyToOne(cascade = PERSIST)
B b;
}
我有以下实体
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
,我的代码就可以工作,因为 b
在 c
之前保存。
我猜持久层级联的顺序很重要。有什么方法可以确保 b 在 c 之前级联吗?
我可能错了,但我认为不可能确保首先级联你的 B 列表,无论如何这都不是最佳做法。
我认为最简单的选择是将级联持久化添加到从 C 到 B 的关系中。
class C {
@ManyToOne
A a;
@ManyToOne(cascade = PERSIST)
B b;
}