首页 > 解决方案 > 为什么 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 (?, ?, ?, ?, ?, ?, ?)

我的阅读方式是:

  1. Hibernate 插入新记录。
  2. 然后 Hibernate 加入 REVINFO 表来检查……什么?
  3. 然后 Hibernate 删除刚刚插入的记录(我猜这应该是他们的回滚版本?)。

CONFIG_AUD 表证实了我的解释,紧随其后的是插入和删除记录。

为什么 Envers 在插入后会删除新记录?它发现了什么触发了明显的回滚?如果插入出现问题需要回滚,hibernate不应该抛出异常而不是成功返回吗?

此问题仅存在于 SIT 版本中。我一直在咨询我的其他同事,但他们都不知道。我无法在我的本地开发设置中重现它(它在这里完美运行)。会不会是配置问题?

附加信息: REVINFO 表是 Envers 创建的默认表,只有一个 REV 和 REVTSTMP 列。

标签: hibernatehibernate-envers

解决方案


推荐阅读