首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >HIbernate Envers:检索插入到同一事务中的快照

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

Stack Overflow用户
提问于 2018-06-04 23:31:39
回答 1查看 343关注 0票数 0

我们有一个需求:使用Hibernate Envers根据差异记录并持久化事务中的实体更改。我们实现了一个RevisionListener

代码语言:javascript
复制
public class MyRevisionListener 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. First assertion:我需要这个检查吗?有了上面的查询,结果是否可能包含两个以上的项?
  2. 第二个断言:我假设每个更改(插入/更新/删除)至少有一个快照(或修订)。是那么回事吗?如果是这样,为什么我的测试用例(使用UPDATE操作)会因为这个断言失败(意味着没有快照)而随机失败。

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

更新

问题出在Spring Test、上下文和bean管理上(特别是我如何获得EntityManager)。我接受了@Naros的帖子,因为它回答了第一个问题,并对第二个问题进行了回答:)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-05 03:54:42

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

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

我假设每个更改(插入/更新/删除)至少有一个快照(或修订)。是那么回事吗?如果是这样,为什么我的测试用例(使用UPDATE操作)会因为这个断言失败(意味着没有快照)而随机失败。

我不期望你的测试用例会随机失败,除非你正在做一些你不应该做的事情。Envers的审计过程是非常确定的,所以我希望它要么失败,要么一致成功。

至于为什么您没有获得预期的行数,我猜测要么是某个刷新模式配置在起作用,可能会干扰Envers审计查询,要么可能是您在保存实体及其关联时查询审计模式,以便预期的有效谓词where子句在那个时刻是无效的?

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50684093

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档