【问题标题】:Alright to truncate database tables when also using Hibernate?还可以在使用 Hibernate 时截断数据库表吗?
【发布时间】:2011-02-23 19:18:25
【问题描述】:

在使用 Hibernate 插入数据的同时截断表可以吗?

我们将一个包含许多关系的大型 XML 文件解析为 Hibernate POJO 并持久化到数据库中。

我们现在计划通过截断表格在特定时间点清除现有数据。这样可以吗?

似乎工作正常。我们不使用 Hibernate 的二级缓存。我确实注意到的一件事很好,那就是在插入时我们使用 Hibernate 的 @GeneratedValue 生成主键,其中 Hibernate 只使用比表中的最大值大一的键值 - 即使我们正在截断表,Hibernate记住先前的值并使用先前的值 + 1,而不是从 1 开始。这很好,只是出乎意料。

请注意,我们截断而不是在 Hibernate POJO 上调用 delete() 的原因是为了速度。我们有数以百万计的数据行,而且截断速度要快得多。

【问题讨论】:

    标签: java oracle hibernate truncate purge


    【解决方案1】:

    我们现在计划通过截断表格在特定时间点清除现有数据。这样可以吗?

    如果你没有使用二级缓存并且你没有从表中加载实体,你将在 Session 中截断,以下应该可以工作(假设它不会破坏完整性约束):

    Session s = sf.openSession();
    PreparedStatement ps = s.connection().prepareStatement("TRUNCATE TABLE XXX");
    ps.executeUpdate();
    

    然后您应该能够在同一事务或另一个事务中持久化实体。

    当然,这样的 TRUNCATE 不会生成任何 Hibernate event 或触发任何 callback,如果这很重要的话。

    (...) 插入时我们使用 Hibernate 的 @GeneratedValue (...) 生成主键

    如果您将默认的strategy 用于@GeneratedValue(即AUTO),那么它应该默认为Oracle 的序列,并且如果您截断表或删除记录,序列将不会被重置。


    我们截断像 jdbcTemplate.execute("TRUNCATE TABLE abc") 这样的表

    这应该是等效的(您最终将使用与 Hibernate 相同的底层 JDBC 连接)。

    Hibernate 对插入使用什么顺序?

    AFAIK,如果您不声明自己的序列,Hibernate 会为您生成默认的 "hibernate_sequence" 序列。

    我以为它只是在桌子上做一个 max(field) + 1?

    不这么认为,而在TRUNCATE 之后 Hibernate 没有从 1 重新开始这一事实似乎证实了它没有。我建议激活 SQL 日志记录以查看在 INSERT 上针对您的数据库执行的确切语句。

    我们为@GeneratedValue 指定的生成器只是一个“虚拟”生成器(不对应于我们创建的任何序列)。

    我不是 100% 确定,但如果你没有声明任何 @SequenceGenerator(或 @TableGenerator),我认为指定生成器不会改变什么。

    【讨论】:

    • 我们会截断像jdbcTemplate.execute("TRUNCATE TABLE abc") 这样的表。 Hibernate 将使用什么序列进行插入?我以为它只是在桌子上做一个 max(field) + 1 ?我们为@GeneratedValue 指定的generator 只是一个“虚拟”生成器(不对应于我们创建的任何序列)。
    【解决方案2】:

    取决于您的应用程序。如果删除数据库中的行是好的,那么 truncate 也是好的。

    只要您的实体上没有任何 Pre- 或 PostRemove 侦听器,应该没有问题。

    另一方面...是否有可能在截断时仍然在 EntityManager 中加载实体,或者这是一个只写表(如日志表)。在这种情况下,您根本不会有任何问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-12-24
      • 1970-01-01
      • 2010-11-18
      • 2012-07-05
      • 2020-09-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多