java - 在带 Hibernate 的 JPA 2 中强制传递持久性顺序?

标签 java hibernate jpa persistence cascade

在 JPA 2 w/Hibernate 中有什么方法可以强制对象的持久化顺序?

假设我有三个类:ParentChildDeskParent 通过@OneToMany 拥有ChildDesk 的集合;一个 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 实例”错误,因为从 ParentDesk 的级联没有产生新的 Desk 对象被持久化了。

我知道我可以通过 EntityManager flush() 操作 (em.flush()) 解决问题 - 创建 Child,创建 Desk,将两者附加到 Parentem.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/

相关文章:

java - 将 "condition ? expr1 : expr2"的链转换为 "if"的链

java - NoSuchMethodError : org. springframework.beans.factory.xml.XmlBeanDefinitionReader

hibernate - 保存Grails(flash:true)

java - 有没有办法以可配置的方式将字段视为@Transient?

java - Android OnCreateOptionsMenu 项目与 actionLayout 不工作

java - 将搜索模型转移到 Dao 的模式

java - 我应该如何在 macOS 上设置 JAVA_HOME 环境变量?

java - 何时关闭 hibernate session ?

java - 子类插入到父类(super class)表中

java - OpenJPA 在使用 JPQL(选择查询)重新获取实体时不会刷新实体