java - 在使用 Hibernate 时可以截断数据库表吗?

标签 java oracle hibernate truncate purge

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

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

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

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

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

最佳答案

We are now planning on purging existing data at certain points in time by truncating the tables. Is this OK?

如果您没有使用二级缓存,并且没有从要在 session 中截断的表中加载实体,则以下操作应该有效(假设它不会破坏完整性约束):

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

之后您应该能够在同一事务或另一事务中持久保存实体。

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

(...) when inserting we generate primary keys using Hibernate's @GeneratedValue (...)

如果您使用 @GenerateValue 的默认策略(即AUTO),那么它应该默认为包含 Oracle 和 a 的序列如果您截断表或删除记录,序列不会重置。

<小时/>

We truncate tables like jdbcTemplate.execute("TRUNCATE TABLE abc")

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

What sequence would Hibernate use for the inserts?

据我所知,如果您没有声明自己的序列,Hibernate 会为您生成默认的“hibernate_sequence”序列。

I thought it was just doing a max(field) + 1 on the table?

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

The generator we specify for @GeneratedValue is just a "dummy" generator (doesn't correspond to any sequence that we've created).

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

关于java - 在使用 Hibernate 时可以截断数据库表吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2906725/

相关文章:

将 Bean 列表传递给 Oracle 存储过程的 Java 程序 - 一次性传递整个列表,而不是一个接一个地附加对象

sql - Oracle "connect by prior"连同 "max() over partition by"删除重复的子树

sql - 如何通过单个测试检查 null/空/空白值?

java - 访问@Id 时出现 LazyInitializationException

mysql - 使用 Hibernate 和 Spring 调用存储过程

java - Tomcat 主页无法正常显示

java - (JavaFX) 如何在构造函数和initialize()之间调用类的方法?

java - 如何在 Log4j 中根据时间而不是大小轮换日志文件?

Java 透明渲染错误

hibernate - @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 何时提交? - 跟进