2011-01-21 56 views
0

我試圖做一個完整的CRUD使用分離對象的集合(即他們創建時沒有使用休眠,並沒有與會話相關聯)。獨立收集更新問題

項目的ID是用戶定義的(未生成)。

集合包含數據庫中已存在的條目和數據庫中不存在的條目。

現有條目應該更新,應插入新條目。

任何存在於數據庫中但不在集合中的條目應該被刪除。

到目前爲止,我一直在試圖從數據庫中刪除所有條目,然後再對集合中的每個項目執行saveOrUpdate:

for (Object entity : session.createCriteria(type).list()) 
    session.delete(entity); 

for (Object entity : collection) 
    session.saveOrUpdate(entity); 

然而,這導致錯誤

一具有相同的不同對象 標識符值已經與會話相關的

我以爲這是因爲刪除循環加載了一個對象到會話中,然後我試圖保存一個具有相同ID的不同對象,所以我更改了代碼,以便我驅逐每個刪除實體:

for (Object entity : session.createCriteria(type).list()) 
{ 
    session.delete(entity); 
    session.evict(entity); 
} 

for (Object entity : collection) 
    session.saveOrUpdate(entity); 

,現在我越來越

org.hibernate.AssertionFailure我: 可能nonthreadsafe訪問 會話

什麼是最exhaustiv執行這種操作的方法。

注意:我需要這樣的事情發生在一個事務在任何情況下都不起作用我不希望數據加載有任何影響。

謝謝。

回答

2

您不應再刪除所有實體,然後再保存它們。相反,我會

  • 找到的所有實體,
  • 比較找到一個新的收集和識別至極實體必須被刪除
  • 刪除這些實體
  • 合併其他的人(使用合併方法,即將已分離實體的狀態複製到附加實體的狀態,即使它們已經在會話中)

請注意,第一步和第二步可以通過查找所有實體除了那些ID在你分離的實體集合中的那些人:「從實體e中選擇e,ID不在(:idsOfDetachedEntities)「

+0

這可能也有幫助:http://stackoverflow.com/questions/1667481/compare-two-lists-for-updates-deletions-and-additions – Pablojim 2011-01-21 13:04:05