我当前的项目是使用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 (?, ?, ?, ?, ?, ?, ?)
我的阅读方式是:
CONFIG_AUD表证实了我的解释,紧随其后的是插入和删除记录。
为什么Envers插入后会删除新记录?它发现什么触发了明显的回滚?而且,如果插入出现问题,需要回滚,那么休眠不应该抛出异常而不是成功返回吗?
此问题仅在SIT版本上存在。我一直在与其他同事协商,但是他们都不知道。我无法在本地开发设置中复制它(在这里完美运行)。可能是配置问题吗?
其他信息: REVINFO表是Envers创建的默认表,只有REV和REVTSTMP列。