2012-04-01 64 views
0

關於hibernate和delete-orphan級聯的問題。假設我有一些Parent類,裏面收集了Child。在父類 的一對多關係的休眠映射中,我設置了cascade all-delete-orphan。假設其餘所有配置都正確。然後,我從父集合(.getChildren()。remove(A))中移除子A並調用session.saveOrUpdate(P)來保存父對象。由於設置了全部刪除孤立級聯,父對象將與一個孩子一起保存,而另一個已刪除的孩子(A)將從數據庫中刪除。這是正確的行爲。Hibernate映射:delete-orphan cascade

據我瞭解,當休眠負載,對象(P),它會返回其子列表到一些持久性集合(如PersistentSet)以及與此集合中的所有操作都是由Hibernate攔截,這允許它來決定哪個孩子應該orphanly刪除從數據庫。

但是..我有後續項目架構:

實體是從數據庫(DO對象)將其傳遞到那裏它被轉換使用推土機架構,服務對象(門面對象)裝載機後。轉換後,將DO對象中的持久性收集轉換爲TO中的簡單ArrayList。然後它被傳遞到UI ,在那裏它可以被修改(從子集合中刪除子A)。當我們把它保存下來時,我們將它傳遞給facade,使用Doser將其轉換回DO對象,然後將它保存到數據庫(使用session.saveOrUpdate)。

在這種情況下,級聯不起作用,並且移除孩子不是孤兒。它仍然以db的形式呈現。

只有當我們調用.merge insted saveOrUpdate時,級聯纔有效。我認爲這是因爲hibernate自動將我們的對象綁定到會話,然後進行更新。

那麼,任何人都可以描述我這種行爲?是否可以使用這種DO - > TO - > DO轉換來支持刪除孤立級聯?

這只是常見的場景和常見問題。如果需要的話,我將能夠連接代碼/映射等

回答

0

session.saveOrUpdate是跟蹤實體,session.merge是未經跟蹤的entites

session.merge是爲這個場景。你有一個未被跟蹤的實體,其變化應該被寫回。合併將根據你給它的對象的id(注意:級聯)加載實體,並將狀態複製到這些被跟蹤的實體上,並在下一次刷新時保存更改。