Java JPA2W/Hibernate中的强制传递持久化顺序?
在JPA2W/Hibernate中有没有办法强制对象的持久化顺序 假设我有三门课:Java JPA2W/Hibernate中的强制传递持久化顺序?,java,hibernate,jpa,persistence,cascade,Java,Hibernate,Jpa,Persistence,Cascade,在JPA2W/Hibernate中有没有办法强制对象的持久化顺序 假设我有三门课:Parent,Child,和DeskParent通过@OneToMany拥有Child和Desk的集合;孩子可以有一张桌子。此外,Parent在两个集合上定义了可传递持久性,但Child没有在其桌面上定义可传递持久性: class Parent { @OneToMany(cascade=CascadeType.ALL) Collection<Child> children; @OneTo
Parent
,Child
,和Desk
Parent
通过@OneToMany
拥有Child
和Desk
的集合;孩子可以有一张桌子
。此外,Parent
在两个集合上定义了可传递持久性,但Child
没有在其桌面上定义可传递持久性:
class Parent {
@OneToMany(cascade=CascadeType.ALL) Collection<Child> children;
@OneToMany(cascade=CascadeType.ALL) Collection<Desk> desks;
...
}
class Child {
@OneToOne(cascade={}) Desk desk;
@ManyToOne Parent parent;
}
class Desk {
@ManyToOne Parent parent;
}
如果我在一个事务中执行上述代码,Hibernate将从父对象
级联到其新的子对象
,并尝试持久化新的子对象。不幸的是,这会导致“对象引用未保存的临时实例”错误,因为从Parent
到Desk
的级联尚未导致新的Desk
对象被持久化
我知道我可以用EntityManager flush()操作(em.flush()
)来解决这个问题-创建子,创建桌面
,将两者都连接到父,em.flush()
,然后将桌面
连接到子,但我不太喜欢把我的代码和em.flush()混在一起
保存新持久对象的复杂图形。是否有不同的方式向JPA 2或Hibernate发出信号,表明它应该始终先持久化新的桌面
,而不是新的子文件
?查看您的描述,我认为持久化系统尝试按照以下顺序首先持久化:
- 首先是父母。孩子[i]
- 每个孩子[i]都有一个指向书桌的临时指针。系统无法将其持久化,因为您尚未将其配置为Cascade.persist
然后它在持久化Desk时失败,您认为它在路径Parent.desks[i](配置为级联)中失败,但失败可能不是来自此路径。为什么您的“OneToOne”级联类型为空?至少应该是“坚持”吗?还有,你怎么知道冬眠会从帕伦传给孩子?桌面可能失败,因为它试图从父对象而不是子对象进行级联失败。桌面
对象的生存期由父对象
的生存期决定,而不是子对象
的生存期-因此父对象。桌面
具有级联类型。所有
,而Child.desk
没有级联。我进行了单元测试,以确认从Parent
到其Desk
对象集合的级联,以及从Parent
到其Child
对象集合的级联。将CascadeType.PERSIST添加到Child.Desk确实实现了所需的行为。我不一定喜欢这个选项,但这总比用em.flush()乱丢代码要好。
Parent parent = em.find(...);
Child child = new Child();
Desk desk = new Desk();
// add both desk and child to parent collections here
// set Parent attribute on both desk and child