2010-08-16 103 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