2010-11-25 88 views
3

我在合併時遇到了一些問題。我的更新方法的工作是這樣的:[休眠]將子對象與瞬態對象合併

void update(Parent parent) { 
    evict(parent); 
    merge(parent); 
} 

我的課:

Parent { 

    Long id; 

    List<Children> childrens; 

    @OneToMany(targetEntity =ChildrenImpl.class, fetch=FetchType.LAZY) 
    @JoinColumn(name="PARENT") 
    @org.hibernate.annotations.Cascade(value = org.hibernate.annotations.CascadeType.ALL) 
    List<Children> getChildrens(){...} 

    @Id 
    Long getId() {...} 

} 



Children{ 

    Parent parent; 

    @ManyToOne(targetEntity = ParentImpl.class, fetch = FetchType.LAZY) 
    @org.hibernate.annotations.Cascade(value = org.hibernate.annotations.CascadeType.ALL) 
    @JoinColumn(name = "PARENT", nullable = false) 
    Parent getParent(){...} 

} 

當我創建一個新的父(瞬態)的對象,並添加新的兒童,並試圖更新(驅逐&合併),那麼日誌顯示我這沖刷休眠會議後:

INSERT PARENT //everythings here is ok. 

INSERT CHILDREN // but without parent id(id=null) 

訂單是好的,但兒童沒有在插入父ID。當父母堅持數據庫時,一切正常,然後孩子總是有一個好的ID。

任何想法我應該怎麼做才能從瞬態對象(從持久確定)獲得id。

Regards KZ。

+0

您是否嘗試先通過session.saveOrUpdate()保存瞬態實例,以便將某個ID附加到實體?你是否在執行子對象插入操作時檢入一個調試器,表明你的實體有一個ID? – fasseg 2010-11-25 23:13:38

回答

2

您無法從瞬態對象獲取id,按照定義,瞬態對象沒有id。

爲什麼你要做一個合併,如果你創建一個新的對象?當你創建一個新的對象時,你應該保存它。如果您更改現有對象的值,則應更新它。只有當持久對象變爲分離時,您才應該合併,並且您需要重新附加它。

+0

然後以一個非常複雜的對象圖爲例。假設我將它導出爲XML,進行一系列更改,然後再導入它。如果必須獲取現有的持久對象,然後將其與舊對象及其所有級聯進行比較,則可能會非常困難且難以維護,依賴關係並更新它。相反,創建一個臨時對象與新對象,新舊對比,將新ID添加到新瞬態對象,合併和保存會很好。這是我想要做的,但你說這是不可能的? – eipark 2013-03-15 15:38:46