2011-09-22 48 views
4

比方說,我有兩個實體,一個PostComment(ColdFusion中):如何級聯刪除Hibernate中的集合?

component persistent="true" table="post" 
{ 
    property name="Id" fieldtype="id"; 
    property name="Comments" fieldtype="one-to-many" cfc="Comment" fkcolumn="post_id" cascade="all"; 
} 

component persistent="true" table="comment" 
{ 
    property name="Id" fieldtype="id"; 
    property name="Post" fieldtype="many-to-one" cfc="Post" column="post_id"; 
} 

PostComments的集合。現在我想刪除一個Post,並自動刪除Comments。我已經嘗試了直接的方法:

var post = EntityLoadByPK("Post", 13); 
EntityDelete(post); 

但我發現了一個Hibernate的錯誤,指出post_id不能設置爲null。我做錯了什麼,我該如何解決這個問題?

+0

哦,評論應該是'cascade =「all-delete-orphan」'而不是。不要忘記將一邊設置爲'inverse =「true」'。 – Henry

回答

2

您需要調整映射。嘗試使註釋的Post屬性不爲null,並將post的Comments屬性標記爲反色。

component persistent="true" table="post" 
{ 
    property name="Id" fieldtype="id"; 
    property name="Comments" fieldtype="one-to-many" cfc="Comment" fkcolumn="post_id" cascade="all" inverse="true"; 
} 

component persistent="true" table="comment" 
{ 
    property name="Id" fieldtype="id"; 
    property name="Post" fieldtype="many-to-one" cfc="Post" column="post_id" notnull="true"; 
} 
+0

我將此應用於我的測試,並開始按預期執行。 –

1

您必須在您的數據庫中的註釋表中填入post_id。這就是休眠如何級聯刪除。它會將post_id = 13的所有註釋設置爲null,然後刪除所有註釋,其中post_id是NULL

+0

我很確定這不是解決方案,考慮到這樣做會破壞參照完整性。 –

+0

我想知道如果還有更好的方法。 – Henry

+0

受此回答及其評論的啓發,我對配置選項進行了相當徹底的調查,並將結果發佈到我的博客上:http://fusiongrokker.com/post/on-cascaded-hibernate-deletes-畢竟最終在我測試過的不同配置組合中,我發現沒有辦法讓Hibernate運行類似'delete from comment where blog = 1;從id = 1''的博客中刪除,而不使用類似HQL的內容。所以可以得到想要的結果,而不是使用'entityDelete()'。 –