2012-10-08 59 views
0

我有一類與Hibernate映射是這樣的: ... 休眠:沒有級聯更新到孩子層如果父母是新

基本上我傳播新(或舊的)磁帶,然後點擊

session.saveOrUpdate(tapeInstance); 

如果磁帶是舊的或新的。我添加的streamrefs全部都是新的(但是如果我從數據庫中檢索磁帶,我希望能夠輕鬆訪問其流文件)。

不幸的是,我不能像我想要的那樣「懶惰」 - 我想要的行爲基本上是「如果磁帶是新的,那麼這意味着它的所有流是新的,所以從不檢查是否可以對它們進行更新,總是插入它們「,但是」如果磁帶是舊的,更新它,刪除舊的流引用,然後將新的流引用添加到它 - 它們總是新/唯一,所以只需添加它們「這樣基本上,不是級聯更新通過,而是通過級聯存儲。這可能嗎?

我已經通過設置級聯=「合併,刪除,鎖定,刷新,驅逐,複製,刪除孤兒」(基本上,它沒有保存更新),然後手動刪除所有舊流,然後手動一次添加一個流。有沒有更好的辦法?

回答

1

通過級聯=「AllDeleteOrphan」,可以通過列表插入和刪除。爲避免更新,我們需要正確指定主鍵的未保存值。然後NHibernate將使用主鍵的值來確定它是新實例還是現有的實例。注意:通過使用「AllDeleteOrphan」級聯選項,如果刪除tapeInstance,則所有關聯的streamref將被刪除。