2010-11-25 60 views
4

我不是hibernate的專家,正如主題中所述,我有一個Object,其中包含一個對象集合。 我試圖用hibernate不會刪除帶有命名查詢的子項,但會刪除session.delete()

session.delete(myObject) 

,並與所有相關兒童被從數據庫中刪除正確的實體。

然而,當我運行一個簡單的命名查詢:

<query name="deleteByID"> 
    DELETE FROM MyObject o WHERE o.objId IN (:objIds) 
</query> 

然後在代碼

Query deleteQuery = s.getNamedQuery("deleteByID"); 
deleteQuery.setParameterList("objIds", objIds); 
return deleteQuery.executeUpdate(); 

,但只有主實體被刪除,而孩子們留在數據庫中。 集合正確標記爲刪除孤立。我想知道爲什麼會出現這種行爲,以及是否有可能通過命名查詢來實現徹底刪除。

回答

4

這是一個已知問題,hibernate不會通過HQL執行級聯刪除。如果加載對象並使用session.delete(object);將其刪除,則會遵循級聯關係。不通過HQL。你有3個選項中的任何一個。

  • 加載它們,並通過調用HQL session.delete();
  • 加載所有的子項,刪除它們,然後真正的對象。
  • 在數據庫級別放置級聯鏈接。所以當你刪除它時,DB會照顧它。

在這裏閱讀更多:https://forum.hibernate.org/viewtopic.php?f=1&t=944722&start=0