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



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

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.第一个断言:我需要这个检查吗?有上述查询 结果是否可能包含两个以上的项目?
2. 第二个断言:我假设每个更改(插入/更新/删除(至少有一个快照(或修订(。是吗?如果是这样,为什么我的测试用例(带有 UPDATE 操作(由于此断言失败(意味着没有快照(而随机失败。

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

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

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

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

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

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

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

没有看到你的测试用例,我只能推测大部分。 如果您可以发布测试用例和实体映射,我可以更深入地挖掘。

最新更新