HIbernate Envers:检索在同一事务中插入的快照

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (50)

我们有一个要求:使用Hibernate Envers记录并在diff中保持事务中的实体更改。我们实施了一个RevisionListener

public class revisionListener implements EntityTrackingRevisionListener {

    @Override
    public void newRevision(Object revision) {
        ...
    }

    @Override
    public void entityChanged(Class entityClass,
                              String entityName,
                              Serializable entityId,
                              RevisionType revisionType,
                              Object revisionEntity) {
        int revisionId = ((DefaultRevisionEntity) revisionEntity).getId();
        List<?> revisions = AuditReaderFactory.get(entityManager)
                .createQuery()
                .forRevisionsOfEntity(entityClass, false, true)
                .add(AuditEntity.id().eq(entityId))
                .add(AuditEntity.revisionNumber().le(revisionId + 1))
                .addOrder(AuditEntity.revisionNumber().desc())
                .setMaxResults(2)
                .getResultList();

        checkArgument(revisions.size() < 3, "Need at most two revisions: %s", revisions);
        checkArgument(revisions.size() > 0, "Need at least one revision: %s", revisions);

        // continue with diff calculation;
    }

}

问题: 1。第一个断言:我需要这个检查吗?具有上述查询结果是否可能包含两个以上的项目? 2.第二个断言:我假设每次更改(INSERT / UPDATE / DELETE)至少有一个快照(或修订版)。是对的吗?如果是这样,为什么我的测试用例(使用UPDATE操作)由于断言失败而意外失败(意味着没有快照)。

如果我需要提供更多信息,请告诉我。

提问于
用户回答回答于

我需要这个检查吗?具有上述查询结果是否可能包含两个以上的项目?

不,setMaxResults(2)将保证查询最多只返回2行; 但是,您需要处理查询返回小于2的用例。

我假设每次更改(INSERT / UPDATE / DELETE)都至少有一个快照(或修订版)。是对的吗?如果是这样,为什么我的测试用例(使用UPDATE操作)由于断言失败而意外失败(意味着没有快照)。

我不希望你的测试用例随机失败,除非你做的事情不应该做。使用Envers的审计流程非常具有确定性,因此我希望它能够失败或一直成功。

至于为什么你没有得到预期的行数,我的猜测可能是某些刷新模式配置正在发挥作用,可能会干扰Envers审计查询,或者你可能在保存实体及其关联时查询审计模式期望的有效谓词where子句在那个精确的时刻是无效的?

在没有看到您的测试用例的情况下,我只能在大多数情况下进行推测。如果你可以发布你的测试用例和实体映射,我可以深入挖掘一下。

所属标签

可能回答问题的人

  • 富有想象力的人

    4 粉丝0 提问6 回答
  • 不吃貓的鱼oo

    5 粉丝466 提问6 回答
  • 人生的旅途

    10 粉丝484 提问6 回答
  • Richel

    8 粉丝0 提问4 回答

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励