[英]Hibernate delete objects on cascade
我對級聯=“刪除”的工作方式感到困惑。 我在“城市”映射文件中以以下方式定義了映射:
<set inverse="true" name="client" cascade="delete">
<key>
<column name="id_name"/>
</key>
<one-to-many class="model.Client"/>
</set>
類客戶具有類城市的外鍵。
因此,當我運行時:
List object = null;
try {
org.hibernate.Transaction tx = session.beginTransaction();
try {
session.delete("from City where row_id=" + row_id and table_id = " + table_id);
} catch (Exception e) {
e.printStackTrace();
}
}
是否還應該刪除所有客戶端,還是必須以某種方式處理它? 我是否將查詢作為方法參數正確傳遞給會話的delete()方法? 謝謝你的幫助。 最好的問候,混蛋。
我對cascade =“ delete”的工作方式有些困惑(...)
級聯delete
操作意味着,如果delete
父級,則該操作將沿關聯傳播。 因此,在您的情況下,刪除City
實體應傳播給Client
。
因此,當我運行(...)時,也應該刪除所有客戶端
Session#delete(String)
方法采用HQL查詢字符串 ,執行該字符串 ,遍歷結果,並在級聯的每個對象上調用Session#delete(Object)
(因此,如果您的查詢確實是HQL查詢,則將刪除客戶端)。
但是此方法很舊,並且在Hibernate 3中已棄用(並移至“經典” Session
接口),我並不推薦這樣做(它執行1 + N操作,刪除大量結果效率很低)。
如果這是一個問題,請使用Hibernate提供的批量刪除支持:
int deleteCount = session.createQuery("delete from Foo where bar = :bar")
.setParameter("bar", bar);
.executeUpdate()
但是請注意,批量刪除有一些限制:
因此,如果要進行批量刪除,則必須在City
之前刪除Client
。 但是性能要好得多。
PS:您需要在某個時候commit()
(並且還要改善錯誤處理,即catch塊中的rollback()
)
如果刪除城市,則所有客戶端也將被刪除。 如果刪除客戶端,則該城市將被保留。
session.delete()
不能與HQL查詢一起調用。 您必須將其傳遞給一個城市才能刪除。
另外,您可以使用session.createSQLQuery()
創建刪除語句。 這樣一來,您就可以刪除許多城市。 這種方法的缺點是必須自己刪除客戶端並刷新緩存(Hibernate不會嘗試理解查詢的含義)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.