Java 如何在双向模式下通过hibernate envers审核一对一关系?

Java 如何在双向模式下通过hibernate envers审核一对一关系?,java,hibernate,hibernate-envers,Java,Hibernate,Hibernate Envers,我正在使用hibernate envers进行审计 我有两个实体类,A和B。它们之间有一对一的关系。 这将创建两个审计表A_aud和B_aud。 两者的创建/更新都通过一个屏幕完成 因此,我的要求是,无论何时,只要这两个表的任何字段中的任何一个表都发生了更改,我就需要在这两个表中都有一个审计条目 我怎样才能做到这一点 这就是我如何定义两边的映射 public class A implements Serializable { private B b;

我正在使用hibernate envers进行审计

我有两个实体类,A和B。它们之间有一对一的关系。 这将创建两个审计表A_aud和B_aud。 两者的创建/更新都通过一个屏幕完成

因此,我的要求是,无论何时,只要这两个表的任何字段中的任何一个表都发生了更改,我就需要在这两个表中都有一个审计条目

我怎样才能做到这一点

这就是我如何定义两边的映射

    public class A implements Serializable {
           private B b;

           @OneToOne(mappedBy = "a", cascade = CascadeType.ALL, fetch = FetchType.LAZY, optional = false)
           public B getB() {
             return b;
           }

           public void setB(B b) {
             this.b = b;
           }
}

public class B implements Serializable{
    private A a;

    @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @JoinColumn(name = "A_ID", referencedColumnName = "id",nullable = false)
    public A getA() {
        return a;
    }

    public void setA(A a) {
        this.a = a;
    }
}

每当两个对象关联时,例如与@OneToOne关联时,对关系任何一方的更改都不会级联对该关系另一方的审核,除非您:

修改关系,例如将B指向a的不同实例 修改关系另一端的属性 从一个简单的变更数据捕获CDC的角度来看,这些规则是有意义的。我的意思是,在屏幕中没有以任何有意义的方式修改的关联实体上的属性不能证明审核行是正确的,因此我们只在实际检测到任何更改的一侧捕获实体实例

在一个复杂的领域模型中,对象之间存在大量的关系。试想一下,如果我们跨关系边界传播这些更改事件,会生成大量的审核行。您可能很容易遇到这样的情况:基本字符串属性的更改将导致对与更改的实体相关的实体的整个对象图进行审核

你有几种方法可以实现你想要的:

使用条件审核 使用属性强制进行审核。 文档中有一整节是关于条件审计的。它最初的目的是控制审计实体的某些更改是否应允许记录实体,但您也可以使用它来导航非常特定的关联实体,并强制对相关实体执行工作单元审计操作。这是一种专家方法,我不推荐不熟悉其操作方式的用户使用。在6.0中,我希望通过某种方式简化此操作,以使其比用户当前必须做的事情更少的干扰

最简单的方法是做2。要使其工作,您需要在两个实体上添加一个新字段,该字段将存储诸如时间戳值之类的内容。每当UI中的任何一个实体发生更改时,您都会为这两个实体设置时间戳,这将有效地迫使Envers在同一事务中审核这两个实体,从而精确地完成您想要的任务


这是用户经常提出的问题,因此我创建了一个更详细的讨论平台,讨论如何以较少干扰的方式在此基础上进行最佳开发和改进。

您能否分享您是如何在两侧定义映射的,例如,映射是单向的、双向的、双向的、双向的,等等?@Naros我编辑了这个问题,添加了我如何定义两边的映射