我们有一个需求:使用Hibernate Envers根据差异记录并持久化事务中的实体更改。我们实现了一个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;
}
}
问题:
如果我需要提供更多信息,请告诉我。
更新
问题出在Spring Test、上下文和bean管理上(特别是我如何获得EntityManager
)。我接受了@Naros的帖子,因为它回答了第一个问题,并对第二个问题进行了回答:)
发布于 2018-06-05 03:54:42
我需要这个检查吗?有了上面的查询,结果是否可能包含两个以上的项目?
不,setMaxResults(2)
将保证查询最多返回2行;但是,您需要处理查询返回小于-2的用例。
我假设每个更改(插入/更新/删除)至少有一个快照(或修订)。是那么回事吗?如果是这样,为什么我的测试用例(使用UPDATE操作)会因为这个断言失败(意味着没有快照)而随机失败。
我不期望你的测试用例会随机失败,除非你正在做一些你不应该做的事情。Envers的审计过程是非常确定的,所以我希望它要么失败,要么一致成功。
至于为什么您没有获得预期的行数,我猜测要么是某个刷新模式配置在起作用,可能会干扰Envers审计查询,要么可能是您在保存实体及其关联时查询审计模式,以便预期的有效谓词where子句在那个时刻是无效的?
如果没有看到您的测试用例,我只能在很大程度上进行推测。如果您可以发布您的测试用例和实体映射,我可以深入挖掘一下。
https://stackoverflow.com/questions/50684093
复制相似问题