有什么方法可以强制带有Hibernate的JPA 2中的对象的持久性顺序?

说我有三个类:ParentChildDeskParent通过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对象。不幸的是,这导致“对象引用了未保存的瞬态实例”错误,因为从ParentDesk的级联还没有导致新的Desk对象被持久化。

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

10-09 08:00