2010-08-16 106 views
30

什麼是刪除休眠表中的所有行的最佳方式休眠並全部刪除

如果我遍歷一個集合,並調用session.delete()它不符合我的知識。

如果我使用其他選項session.createQuery("delete ...")它不會影響持久性上下文。

當我應該使用這些方法,如果沒有更好的變種?

回答

22
  • ,如果你沒有什麼級聯,使用HQL刪除DELETE FROM enityName
  • 如果你有瀑布,遍歷集合和分別刪除每一個。

問題在於,hibernate在內部處理級聯,而不是將其留給數據庫。因此,發送查詢不會觸發內部級聯,因此您將有不一致/孤兒。

如果性能如此重要(畢竟不是每天都會截斷表),那麼每個級聯可以有多個HQL刪除 - 即手動處理級聯。

4
String stringQuery = "DELETE FROM tablename"; 
Query query = session.createQuery(stringQuery); 
query.executeUpdate(); 
+0

爲什麼使用createQuery比迭代集合並調用session.delete()更好?我沒有持久性上下文的問題嗎? – feiroox 2010-08-16 11:03:42

+0

比什麼更好? – thelost 2010-08-16 11:04:56

+3

@feiroox:最好是因爲當你迭代Collection並調用delete時,它會刪除一行和一行。這是一個很大的性能問題。然而,就像Bozho所說,如果你有瀑布,你可能會想這樣做。 – 2010-08-16 11:20:06

23

您可以使用HQL用於截斷表

public int hqlTruncate(String myTable){ 
    String hql = String.format("delete from %s",myTable); 
    Query query = session.createQuery(hql) 
    return query.executeUpdate(); 
} 
+0

這是執行此操作的最佳方法 – 2010-08-16 11:18:04

+7

您必須在查詢不是表中編寫java類文件的名稱。 – 2013-04-25 10:43:08

+4

不級聯刪除,因此可能違反fk約束。 – atamanroman 2014-02-03 12:19:59