我正在使用 Hibernate Auditions 和 Hibernate 版本 3.5。虽然当我尝试在一个事务中在一个表中插入单个记录时它工作正常,但问题是当“BATCH”运行时 它会在单个事务中将多条记录插入一个表中,然后为审计表生成single“rev id”,这会导致“integrityconstraintsviolation”。
由于 Hibernate 的正常行为,所有插入查询都会在 tansaction 结束时触发(当它刷新时),但此时只有一个查询被触发以生成“rev id”。
select hibernate_sequence.nextval from dual;
请告诉我这是审核中的错误还是我遗漏了什么? 预先感谢
revid 始终跨越多个表中的修改!
是的,插入是在事务结束时调用的,但是:如果使用乐观事务隔离,事务可以读取当前活动但尚未提交的另一个事务的未提交状态。
如果您违反了完整性约束,则
rev_id
列不幸被配置为“唯一”。这是错误的数据库模式!通过删除列的唯一性来更正架构 rev_id
!
全局休眠关系表中的
rev_id
列必须是唯一的,因为它是主键! (全局休眠关系表通常还包含时间戳)。
不确定您是否仍然遇到这个问题:)。就我而言,我遇到了同样的问题,解决方案是在“rev”和“id”列上设置审核表复合主键。 下面是 Liquibase 脚本示例:
<addPrimaryKey
columnNames="id, rev"
constraintName="t_order_aud_pk"
tableName="t_order_aud"/>