有什么方法可以强制带有Hibernate的JPA 2中的对象的持久性顺序?
说我有三个类:Parent
,Child
和Desk
。 Parent
通过Child
拥有Desk
和@OneToMany
的集合;一个Child
可以有一个Desk
。此外,Parent
在两个集合上定义了传递持久性,但是Child
没有在其Desk
上定义传递持久性:
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;
}
理想情况下,我想同时创建一个桌子和一个孩子并保持关系:
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
如果我在事务中执行以上代码,则Hibernate从
Parent
级联到其新的Child
,并尝试保留新的Child
对象。不幸的是,这导致“对象引用了未保存的瞬态实例”错误,因为从Parent
到Desk
的级联还没有导致新的Desk
对象被持久化。我知道我可以使用EntityManager flush()操作(
em.flush()
)来解决问题-创建Child
,创建Desk
,将两者都附加到Parent
,em.flush()
,然后将Desk
附加到Child
,但是我不太喜欢用em.flush()
乱七八糟的代码来保存新的持久对象的复杂图形。有没有其他方法可以向JPA 2或Hibernate发出信号,通知它应该始终首先保留新的Desk
而不是新的Child
? 最佳答案
查看您的描述,我认为持久性系统首先尝试按此顺序持久化:
首先是Parent.children [i]
每个Children [i]都有一个指向Desk的临时指针。系统无法将其持久化,因为您尚未将其配置为Cascade.Persist。
然后在持久化Desk时失败,并且您认为它在路径Parent.desks [i](配置为Cascade)中失败,但是失败可能不是来自此路径。
关于java - 强制使用 hibernate 状态的JPA 2中的传递持久性顺序?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7357424/