我们现在计划通过截断表在某些时间点清除现有数据。这个可以吗?
如果您没有使用二级缓存并且没有从表中加载实体,您将在 Session 中截断,则以下内容应该有效(假设它不会破坏完整性约束):
Session s = sf.openSession();
PreparedStatement ps = s.connection().prepareStatement("TRUNCATE TABLE XXX");
ps.executeUpdate();
之后,您应该能够在同一个事务或另一个事务中持久化实体。
当然,如果这很重要,这样的 TRUNCATE 不会生成任何 Hibernate事件或触发任何回调。
(...) 插入时我们使用 Hibernate 的@GeneratedValue
(...)
如果您使用(ie ) 的默认strategy
值,那么它应该默认为 Oracle 的序列,并且如果您截断表或删除记录,则不会重置序列。@GeneratedValue
AUTO
我们截断像 jdbcTemplate.execute("TRUNCATE TABLE abc") 这样的表
这应该是等效的(您最终将使用与 Hibernate 相同的底层 JDBC 连接)。
Hibernate 将使用什么序列进行插入?
"hibernate_sequence"
AFAIK,如果您不声明自己的,Hibernate 会为您生成默认序列。
我以为它只是在桌子上做一个 max(field) + 1 ?
我不这么认为,而且 Hibernate 不会在 1 之后从 1 重新开始这一事实TRUNCATE
似乎证实了它没有。我建议激活 SQL 日志记录以查看在 INSERT 上针对您的数据库执行的确切语句。
我们指定的生成器@GeneratedValue
只是一个“虚拟”生成器(不对应于我们创建的任何序列)。
我不是 100% 确定,但如果你没有声明任何@SequenceGenerator
(或@TableGenerator
),我认为指定生成器不会改变什么。