【问题标题】:hibernate and delete all休眠并删除所有
【发布时间】:2010-08-16 10:50:36
【问题描述】:

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

如果我遍历一个集合并调用 session.delete(),据我所知,它并没有执行。

如果我使用另一个选项 session.createQuery("delete ...") 它不会影响持久性上下文。

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

【问题讨论】:

    标签: java hibernate sql-delete


    【解决方案1】:
    • 如果您没有要级联的内容,请使用 HQL 删除 DELETE FROM enityName
    • 如果您有级联,请迭代集合并单独删除每个集合。

    问题在于hibernate在内部处理级联,而不是将其留给数据库。因此发送查询不会触发内部级联,因此您将遇到不一致/孤儿。

    如果性能如此重要(毕竟不是每天都会截断一个表),那么您可以为每个级联删除 1 个以上的 HQL - 即手动处理级联。

    【讨论】:

      【解决方案2】:

      您可以使用 HQL 截断表格

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

      【讨论】:

      • 这是最好的方法
      • 你必须在查询而不是表中写入java类文件的名称。
      • 不级联删除,因此可能违反 fk 约束。
      • 这不是截断。
      【解决方案3】:
      String stringQuery = "DELETE FROM tablename";
      Query query = session.createQuery(stringQuery);
      query.executeUpdate();
      

      【讨论】:

      • 为什么使用 createQuery 比遍历集合并调用 session.delete() 更好?难道我对持久性上下文没有问题吗?
      • @feiroox:这样会更好,因为当你遍历 Collection 并调用 delete 时,它​​会删除一行和一行。这是一个很大的性能问题。然而,就像 Bozho 所说,如果你有级联,你可能会想要那样做。
      • 如上所述,这不处理级联。我不知道是否可以更强烈地强调这一点。我曾经浪费了很多时间,因为我认为运行 HQL 会处理级联。毕竟它是休眠查询语言。但是,可悲的是,事实并非如此。您必须执行 session.delete() 但这确实会为每个单独的记录发出一条 SQL 语句,效率非常低。
      猜你喜欢
      • 2011-04-11
      • 2014-09-25
      • 1970-01-01
      • 2013-05-25
      • 2011-02-16
      • 2012-02-07
      • 2010-11-03
      • 2023-04-06
      • 1970-01-01
      相关资源
      最近更新 更多