Java 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

在JPA2W/Hibernate中有没有办法强制对象的持久化顺序

假设我有三门课:
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