2

我正在使用 Hibernate Envers 记录对数据库的所有更改。我注意到,当我添加一个与另一个实体具有 ManyToOne 关系的实体时,也对一侧实体进行了修订。外键位于关系的多方面,因此当在多方面添加实体时,映射一侧的实体不会更新。但仍在为映射一侧的实体插入修订。

我使用此处建议的方法禁用了 OneToMany 映射的审核: Whats the difference between @NotAudited and RelationTargetAuditMode.NOT_AUDITED in Hibernate EnVers?

现在这个答案表明,当我检索关系时,它总是会返回当前实体。这是否意味着我无法获得旧版本映射一侧的信息?

目前我不确定如何查询已审核的日志,但从表结构看来,我可以随时获取实体的当前状态。

假设我选择不审计 OneToMany 映射,那么下面的表结构会发生什么?

审核 OneSideEntity 修订版 1 的 OneSideEntity 修订版 5 的 OneSideEntity

审核 ManySideEntity1 ManySideEntity1 at revision 2 ManySideEntity1 at revision 3 ManySideEntity1 ManySideEntity1 at revision 2

审核 ManySideEntity2 版本 6 的 ManySideEntity2 版本 7 的 ManySideEntity2 版本 8 的 ManySideEntity2 版本 9 的 ManySideEntity2

两个 ManySideEntity 对象都指向 OneSideEntity。

当我在修订版 5 - [ManySideEntity1] 或 [ManySideEntity1, ManySideEntity2] 查询一对多映射时,我将获得哪些实体。

上述问题表明我会得到后者,但在修订版 5 中我更喜欢第一个。我在这里错过了什么吗?

同样对于给定的时间戳,我认为我可以找到小于该时间戳的所有修订。这可以确保我在 AUDITING 日志中有准确的表信息。如果答案是 [ManySideEntity1, ManySideEntity2] 为什么会丢失信息?

4

1 回答 1

3

也许你想设置org.hibernate.envers.revision_on_collection_changefalse?(见http://docs.jboss.org/hibernate/core/4.1/devguide/en-US/html/ch15.html#d5e3937

在双向一对多关系中改变关系的一侧是否会改变双方是有争议的,并且取决于用例。在数据库中,没有任何变化,但另一方面,Java 对象发生了变化(集合中有一个新元素)。

于 2013-03-15T12:22:29.970 回答