有什麼辦法來強制JPA 2 w/Hibernate中的對象的持久性順序?在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;
}
理想情況下,我想創建在同一時間一張書桌和一個兒童和持續的關係:
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
如果我在事務執行上面的代碼,從休眠級聯Parent
到其新Child
並試圖堅持新Child
對象。不幸的是,這會導致「對象引用未保存的瞬態實例」錯誤,因爲從Parent
到Desk
的級聯尚未導致新的對象仍未被保存。
我知道我可以用一個EntityManager的flush()操作(em.flush()
)解決問題 - 創建Child
,創建Desk
,重視既Parent
,em.flush()
,然後連接到Desk
Child
,但我不超 - 用em.flush()
來拋棄我的代碼來保存新的持久對象的複雜圖形。是否有不同的方式向JPA 2或Hibernate發信號通知應該始終堅持新的Desk
而不是新的Child
?
爲什麼您的「OneToOne」級聯類型爲空?它不應該至少是「PERSIST」嗎?而且,你如何知道從Paren到Child的Hibernate級聯?可能Desk失敗,因爲它試圖從父級級聯失敗,而不是從Child級聯。 – edutesoy
Desk對象的生命週期由Parent對象的生命週期而不是Child對象決定,因此Parent.desks具有CascadeType.ALL而Child.desk沒有級聯。 我有單元測試確認級聯從'Parent'到'Desk'對象的集合,從'Parent'到它的'Child'對象的集合。 – BobG