为什么Envers阅读REVINFO

时间:2019-08-19 08:20:58

标签: hibernate hibernate-envers

我当前的项目是使用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. 休眠然后加入REVINFO表以检查...某些东西吗?
  3. 然后,Hibernate删除刚刚插入的记录(我猜这应该是他们的回滚版本?)。

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

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

此问题仅在SIT版本上存在。我一直在与其他同事协商,但是他们都不知道。我无法在本地开发设置中复制它(在这里完美运行)。可能是配置问题吗?

其他信息: REVINFO表是Envers创建的默认表,只有REV和REVTSTMP列。

0 个答案:

没有答案