在 JPA 2 w/Hibernate 中有什么方法可以强制对象的持久化顺序?
假设我有三个类:Parent
、Child
和 Desk
。 Parent
通过@OneToMany
拥有Child
和Desk
的集合;一个 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;
}
理想情况下,我想同时创建一个 Desk 和一个 Child 并保持关系:
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
对象.不幸的是,这会导致“对象引用未保存的 transient 实例”错误,因为从 Parent
到 Desk
的级联没有产生新的 Desk
对象被持久化了。
我知道我可以通过 EntityManager flush() 操作 (em.flush()
) 解决问题 - 创建 Child
,创建 Desk
,将两者附加到 Parent
,em.flush()
,然后将 Desk
附加到 Child
,但我并不是特别热衷于使用 em.flush()
来保存我的代码以保存新持久对象的复杂图形。是否有不同的方式向 JPA 2 或 Hibernate 发出信号,表明它应该始终首先保留新的 Desk
而不是新的 Child
?
最佳答案
看你的描述,我认为Persistence系统首先尝试按以下顺序持久化:
- 首先是 Parent.children[i]
- 每个 Children[i] 都有一个指向 Desk 的临时指针。系统无法持久化它,因为您尚未将其配置为 Cascade.Persist。
然后在持久化 Desk 时失败,您认为它在路径 Parent.desks[i](配置为 Cascade)中失败,但也许失败并非来自此路径。
关于java - 在带 Hibernate 的 JPA 2 中强制传递持久性顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7357424/