2006-03-21

[Gain] Hibernate Delete Orphan

Hibernate的cascade屬性中有一個設定為delete-orphan(經常搭配all使用,成為all-delete-orphan),其主要功用在於將一個child自parent裡移除時,例如:

parent.getChildren().remove(aChild);

這樣若有設定delete-orphan,則aChild不只從parent中移除,也會從DB中移除!
但是有一些限制:
  1. 在同一個session裡進行操作時,不可將child所在的Collection置換成另一個Collection,Hibernate會出Exception,因為Hibernate是透過對該Collection監控的方式來決定children的新增、修改或刪除。

    parent.setChildren(new HashSet());

  2. 如果是在aSession中載入parent物件,然後離開aSession,再對children進行增修刪,最後進入bSession進行parent的update,這樣delete-orphan的作用仍有效,也就是children中沒有Primary key的會新增至DB,有Primary key會更新,最後從children裡移除的child會自DB中刪除。
  3. 最後一種狀況,類似第二點的作法,但是差別在離開aSession後,原children的Collection被置換成另一個Collection,這樣再度進入session進行update後,Hibernate只會進行新增與修改的動作,不會進行刪除的動作,例如:原先的children有A、B與C,在置換成新的Collection之後,修改成B、C與D(移除A與新增D),這樣update後,最後DB中會有A、B、C與D四個child。因為Collection被換掉,所以Hibernate無法進行delete-orphan的動作。

沒有留言:

張貼留言