Java 休眠并删除所有

Java 休眠并删除所有,java,hibernate,sql-delete,Java,Hibernate,Sql Delete,在Hibernate中删除表中所有行的最佳方法是什么 如果我迭代一个集合并调用session.delete(),据我所知,它不会执行 如果我使用另一个选项session.createQuery(“删除…”)它不会影响持久性上下文 若并没有更好的变体,我什么时候应该使用这些方法?您可以使用HQL来截断表 String stringQuery = "DELETE FROM tablename"; Query query = session.createQuery(stringQuery); quer

在Hibernate中删除表中所有行的最佳方法是什么

如果我迭代一个集合并调用
session.delete()
,据我所知,它不会执行

如果我使用另一个选项
session.createQuery(“删除…”)
它不会影响持久性上下文


若并没有更好的变体,我什么时候应该使用这些方法?

您可以使用HQL来截断表

String stringQuery = "DELETE FROM tablename";
Query query = session.createQuery(stringQuery);
query.executeUpdate();
public int hqlTruncate(String myTable){
    String hql = String.format("delete from %s",myTable);
    Query query = session.createQuery(hql)
    return query.executeUpdate();
}
  • 如果没有要级联的内容,请使用HQL delete
    delete FROM enityName
  • 如果有级联,则迭代集合并逐个删除
问题在于hibernate在内部处理级联,而不是将其留给数据库。因此,发送查询不会触发内部级联,因此会出现不一致/孤立


如果性能非常关键(毕竟不是每天都会截断一个表),那么每个级联可以有超过1个HQL delete,即手动处理级联。

为什么使用createQuery比在集合和调用会话上迭代要好。delete()?我对持久性上下文有问题吗?@feiroox:这样更好,因为当您迭代集合并调用delete时,它将删除一行和一行。这是一个很大的性能问题。然而,正如Bozho所说,如果你有级联,你可能会想这样做。如上所述,这不处理级联。我不知道是否有可能更强烈地强调这一点。我曾经浪费了很多时间,因为我认为运行HQL可以处理级联。它毕竟是Hibernate查询语言。但遗憾的是,事实并非如此。您必须执行session.delete(),但这会为每个记录发出一个SQL语句,这是非常低效的。这是最好的方法。您必须在query not表中写入java类文件的名称。不会级联删除,因此可能会违反fk约束。这不是截断。