簡體   English   中英

休眠級聯刪除對象

[英]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()

但是請注意,批量刪除有一些限制:

  • 您不能使用別名。
  • 查詢中沒有內部聯接(盡管您可以在where子句中使用子選擇)。
  • 批量刪除不會級聯 (並且不會處理聯接表)。

因此,如果要進行批量刪除,則必須在City之前刪除Client 但是性能要好得多。

PS:您需要在某個時候commit() (並且還要改善錯誤處理,即catch塊中的rollback()

參考文獻

  1. 如果刪除城市,則所有客戶端也將被刪除。 如果刪除客戶端,則該城市將被保留。

  2. session.delete()不能與HQL查詢一起調用。 您必須將其傳遞給一個城市才能刪除。

另外,您可以使用session.createSQLQuery()創建刪除語句。 這樣一來,您就可以刪除許多城市。 這種方法的缺點是必須自己刪除客戶端刷新緩存(Hibernate不會嘗試理解查詢的含義)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM