2012-11-19 41 views
0

我正在處理導入功能,其中我必須從文件導入數據並使用休眠將其更新到數據庫。休眠不保持堅持順序

對象結構是:有一個父對象,它有一組子對象。

當我進行導入時,我首先刪除所有現有的孩子,然後添加我從文件中讀取的新孩子。

我做到這一點的方法是如下

parent = session.load(<id of parent>) 
parent.getchildrenSet.clear() 
parent.saveOrUpdate(parent); 

然後,在一個循環中創建新的兒童,並將其添加到childrenSet父。然後

parent.saveOrUpdate(parent); 

映射情況如下

在家長

@OneToMany(cascade = CascadeType.ALL) 
    @JoinTable(name = "CHILD_TABLE", joinColumns = { @JoinColumn(name = "CHILD_PARENT_ID") }, inverseJoinColumns = { @JoinColumn(name = "CHILD_ID") }) 
    @MapKeyColumn(name = "CHILD_ID") 
    private Map<Long, Children> childrenMap; 

在兒童

@ManyToOne(cascade = CascadeType.ALL) 
    @JoinColumn(name = "CHILD_PARENT_ID") 
    private Parent parent; 

當我運行這段代碼我預期的日誌打印的DML中以下訂單
1.刪除所有的孩子
2.插入新的兒童
3.更新父

但它打印的是
1.插入新的兒童
2.更新父
3。刪除所有的孩子

因此,作爲上述命令的結果,它將從父母中刪除所有孩子,甚至是因爲導入而新增的孩子。

看起來好像hibernate不會維護我調用DML的順序。任何人都可以提供一些建議嗎?如果問題不明確,請告知我。

+0

您可以嘗試在[session.flush()](http://docs.jboss.org/hibernate/orm/3.5/api/org/hibernate/Session.html#flush%28%29)之後執行第一個saveOrUpdate()? – Pablo

+0

我介紹了其他來源,發現不建議使用session.flush。 – shashikanthb

+0

同花順是不好的風格。你的映射怎麼看? –

回答

0

Collections.clear()不等於刪除。你需要調用一個明確的刪除來確保你在刪除之前刪除。否則,當會話終止時,隱式刪除將得到緩衝。

+0

謝謝@Farhan,我會嘗試。你可以建議我一本好書,這將有助於我理解Hibernate – shashikanthb

+0

我從「NHibernate in Action」一書中學到了很多,我猜http://www.manning.com/bauer/也很好 –