我正在升级到 hibernate 6。我们在一些具有复杂域和大量数据的服务上广泛使用 envers。我们使用 liquibase 生成数据库迁移脚本。
我很惊讶地发现 liquibase 在升级后生成了大量数据库变更集...所有这些变更都与“_aud”表相关,删除并重新创建主键:在 hibernate 5 中,审核表主键中字段的顺序是“id,rev”,在 hibernate 6 中是“rev,id”。
Liquibase 发现这种差异会生成尝试解决所有这些问题的变更集,但它并不完整...(删除外键中使用的主键不起作用)...这意味着需要将 2000 多行文件手动修复...
修复有效的东西需要大量工作,更改将需要很长时间才能修复,而且还要在产品中执行,并且可能会对我无法衡量的性能产生影响......所以我真的很喜欢推迟到稍后的时间。
有没有办法恢复到 hibernate 5 的旧行为,比如配置之类的? (我看了,但什么也没发现)
这是一个用于说明行为的简单实体:
@Entity
@Audited
public class MyEntity {
@Id
private Long id;
private String name;
}
这是在 hibernate 5.6.15.Final 中生成的:
<changeSet author="snussbaumer (generated)" id="1693555682159-2">
<createTable tableName="my_entity_aud">
<column name="id" type="BIGINT">
<constraints nullable="false" primaryKey="true" primaryKeyName="my_entity_audPK" />
</column>
<column name="rev" type="INT">
<constraints nullable="false" primaryKey="true" primaryKeyName="my_entity_audPK" />
</column>
<column name="revtype" type="TINYINT" />
<column name="name" type="VARCHAR(255)" />
</createTable>
</changeSet>
这就是 hibernate 6.2.7.Final :
<changeSet author="snussbaumer (generated)" id="1693555682159-2">
<createTable tableName="my_entity_aud">
<column name="id" type="BIGINT">
<constraints nullable="false" />
</column>
<column name="rev" type="INT">
<constraints nullable="false" />
</column>
<column name="revtype" type="TINYINT" />
<column name="name" type="VARCHAR(255)" />
</createTable>
</changeSet>
<changeSet author="snussbaumer (generated)" id="1693555682159-4">
<addPrimaryKey columnNames="rev, id" constraintName="my_entity_audPK" tableName="my_entity_aud" />
</changeSet>
经过相当多的挖掘,“问题”来自于这个相当大的提交:https://github.com/hibernate/hibernate-orm/commit/fb882f56f313e09889c362952e489ec26d527765
现在键按名称排序,就是这样......没有配置可以更改它。这确实忽略了对性能的任何考虑(但这也许留给库的用户来做)。
一些解决方法: