在使用 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/