不审核 OneToMany 关系的缺点是啥?

Posted

技术标签:

【中文标题】不审核 OneToMany 关系的缺点是啥?【英文标题】:What is the disadvantage of not auditing OneToMany relations?不审核 OneToMany 关系的缺点是什么? 【发布时间】:2013-03-03 10:44:13 【问题描述】:

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

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

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

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

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

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

对 ManySideEntity1 的审核 修订版 2 中的 ManySideEntity1 修订版 3 中的 ManySideEntity1 修订版 4 中的 ManySideEntity1

对 ManySideEntity2 的审核 修订版 6 中的 ManySideEntity2 修订版 7 中的 ManySideEntity2 修订版 8 中的 ManySideEntity2 修订版 9 中的 ManySideEntity2

ManySideEntity 对象都指向 OneSideEntity。

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

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

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

【问题讨论】:

【参考方案1】:

也许您想将org.hibernate.envers.revision_on_collection_change 设置为false? (见http://docs.jboss.org/hibernate/core/4.1/devguide/en-US/html/ch15.html#d5e3937)

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

【讨论】:

以上是关于不审核 OneToMany 关系的缺点是啥?的主要内容,如果未能解决你的问题,请参考以下文章

与一个实体的多个 OneToMany 关系

Hibernate:映射@OneToMany 关系的最后一行

OneToMany 关系不起作用

JPA:关于 OneToMany 关系中阻抗不匹配的问题

使用注解的Hibernate one-to-many映射

笔记:Hibernate 持久化类标注示例-双向1-N关系映射