hibernate - 为什么 Envers 在阅读 REVINFO 后会删除新记录
问题描述
我目前的项目是使用 Hibernate Envers 来审计表。我有一个声明如下的实体:
@Entity
@Table(name = "CONFIG")
@Audited()
@Data
@JsonIgnoreProperties({ "hibernateLazyInitializer", "handler" })
public class Configuration extends DetailedAuditEntity {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "config_sequence")
@SequenceGenerator(name = "config_sequence", sequenceName = "CONFIG_SEQ")
private Long id;
@Version
private Long version;
// other columns
@Override
public boolean equals(Object obj) {
// equals override
}
@Override
public int hashCode() {
// hashcode override
}
}
这在我的本地设置上运行良好,我可以使用 JPARepository 的.save()
功能插入和更新记录。但是,在将这段代码部署到 SIT 后,测试团队提出了一个问题,即他们创建新配置后,系统显示“记录创建成功”消息,但他们无法在记录表中看到新配置。
所以我翻阅了 SIT 日志,这就是我发现的(我删除了一堆列以使其更具可读性)。
Aug 19 06:25:32 IEXBIZSVC02 java[19539]: Hibernate: insert into CONFIG (ACTION, IS_SAGA_IN_PROGRESS, STATUS, CONFIG_CATEGORY, VERSION, ID) values (?, ?, ?, ?, ?, ?)
Aug 19 06:25:32 IEXBIZSVC02 java[19539]: Hibernate: insert into REVINFO (REVTSTMP) values (?)
Aug 19 06:25:32 IEXBIZSVC02 java[19539]: Hibernate: insert into CONFIG_AUD (REVTYPE, ACTION, IS_SAGA_IN_PROGRESS, STATUS, CONFIG_CATEGORY, ID, REV) values (?, ?, ?, ?, ?, ?, ?)
Aug 19 06:25:32 IEXBIZSVC02 java[19539]: Hibernate: select con0_.ID as ID1_183_0_, con0_.REV as REV2_183_0_, defaultrev1_.REV as REV1_13_1_, con0_.REVTYPE as REVTYPE3_183_0_, con0_.ACTION as ACTION4_183_0_, con0_.IS_SAGA_IN_PROGRESS as IS_SAGA_5_183_0_, con0_.STATUS as STATUS6_183_0_, con0_.CONFIG_CATEGORY as CONFIG_CA26_183_0_, defaultrev1_.REVTSTMP as REVTSTMP2_13_1_ from CONFIG_AUD con0_ cross join REVINFO defaultrev1_ where con0_.REVTYPE<>? and con0_.ID=? and con0_.REV=(select max(con2_.REV) from CONFIG_AUD con2_ where con2_.ID=? and con2_.ID=con0_.ID) and con0_.REV=defaultrev1_.REV order by con0_.REV asc
Aug 19 06:25:32 IEXBIZSVC02 java[19539]: Hibernate: select con0_.ID as ID1_182_0_, con0_.ACTION as ACTION2_182_0_, con0_.IS_SAGA_IN_PROGRESS as IS_SAGA_3_182_0_, con0_.STATUS as STATUS4_182_0_, con0_.CONFIG_CATEGORY as SCUP_CA24_182_0_, con0_.VERSION as VERSION26_182_0_ from CONFIG con0_ where con0_.ID=?
Aug 19 06:25:32 IEXBIZSVC02 java[19539]: Hibernate: delete from CONFIG where ID=? and VERSION=?
Aug 19 06:25:32 IEXBIZSVC02 java[19539]: Hibernate: insert into REVINFO (REVTSTMP) values (?)
Aug 19 06:25:32 IEXBIZSVC02 java[19539]: Hibernate: insert into CONFIG_AUD (REVTYPE, ACTION, IS_SAGA_IN_PROGRESS, STATUS, CONFIG_CATEGORY, ID, REV) values (?, ?, ?, ?, ?, ?, ?)
我的阅读方式是:
- Hibernate 插入新记录。
- 然后 Hibernate 加入 REVINFO 表来检查……什么?
- 然后 Hibernate 删除刚刚插入的记录(我猜这应该是他们的回滚版本?)。
CONFIG_AUD 表证实了我的解释,紧随其后的是插入和删除记录。
为什么 Envers 在插入后会删除新记录?它发现了什么触发了明显的回滚?如果插入出现问题需要回滚,hibernate不应该抛出异常而不是成功返回吗?
此问题仅存在于 SIT 版本中。我一直在咨询我的其他同事,但他们都不知道。我无法在我的本地开发设置中重现它(它在这里完美运行)。会不会是配置问题?
附加信息: REVINFO 表是 Envers 创建的默认表,只有一个 REV 和 REVTSTMP 列。
解决方案
推荐阅读
- python-3.x - 如何将 tkinter 与函数及其变量一起使用
- javascript - Webpack 源映射奇怪的行为
- ios - 在 Xcode Beta 中分发构建时出现“IPA 处理失败”
- node.js - MongoDB 版本 4^ -- 获取节点 js 中所有数据库的列表
- java - 在 Selenium Java 中找不到元素
- networking - 为什么在 Spring Tool Suite 4 的内容开始时出现 SunCertPathBuilderException?
- c - uint16_t 和 uint32_t 之间的区别
- wordpress - Wordpress,条件小部件显示
- javascript - 从 JavaScript 调用 Angular 7 方法
- intellij-idea - Bazel 同步成功,但出现同步错误