hibernate - 恩弗斯 : Unidirectional OneToMany without additional audit table?

标签 hibernate hibernate-envers jpa-2.1

以下数据库架构:

员工[EMP_ID (PK)、姓名、工资]

电话[ID (PK)、number_str、OWNER_ID (FK)]

Employee_aud[EMP_ID (PK)、REV (PK/FK)、REVTYPE、姓名、工资]

Phone_aud[ID (PK)、REV (PK/FK)、REVTYPE、number_str]

Employe_phone_aud[REV(PK/FK)、OWNER_ID(PK/FK)、REVTYPE(PK/FK)]

可以用以下Java实体来表示:

员工:

@Entity
@Audited
public class Employee {

    @Id
    @GeneratedValue
    @Column(name = "EMP_ID")
    private long id;

    @Column
    private String name;

    @Column
    private int salary;

    @OneToMany
    @JoinColumn(name = "OWNER_ID", referencedColumnName = "EMP_ID")
    private final List<Phone> phones = new ArrayList<Phone>();

    public Employee(final String name, final int salary) {
        this.name = name;
        this.salary = salary;
    }

    public long getId() {
        return id;
    }

    public void setId(final long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(final String name) {
        this.name = name;
    }

    public int getSalary() {
        return salary;
    }

    public void setSalary(final int salary) {
        this.salary = salary;
    }

    public void addPhone(final Phone phone) {
        this.phones.add(phone);
    }
}

电话:

@Entity
@Audited
public class Phone {

    @Id
    @GeneratedValue
    private long id;

    @Column(name = "number_str")
    private String number;

    public Phone(final String number) {
        this.number = number;
    }

    public long getId() {
        return id;
    }

    public void setId(final long id) {
        this.id = id;
    }

    public String getNumber() {
        return number;
    }

    public void setNumber(final String number) {
        this.number = number;
    }
}

如您所见,审计表之间有一个链接表,但实体表之间没有链接表。在 Hibernate-Envers 开发人员指南中,我发现了以下文本:

When a collection is mapped using these two (@OneToMany+@JoinColumn) annotations, Hibernate doesn't generate a join table. Envers, however, has to do this, so that when you read the revisions in which the related entity has changed, you don't get false results.

这是我对这段文字的解释: 我的员工实体可能属于许多电话实体。例如,如果我向某个员工添加电话,那么我的员工就会被修改,因此必须进行审核条目。使用上面的映射,这将导调用话实体的审核条目,而不是员工的审核条目。使用链接表可以解决此问题(因为该表描述了员工拥有的电话集合中的更改)。

现在我的 3 个问题: - 我对上述陈述的理解是否正确,还是我遗漏了一些特别的东西? - 如果 Envers 没有创建此链接表,也可以通过查看phone_aud 表来跟踪这些关系。这是真的? - 是否可以配置/扩展 envers 以支持此行为?

注意:我问这个问题只是因为我想知道是否可以摆脱额外的链接表并更好地理解为什么需要它。

谢谢!

最佳答案

  1. 是的,您正确理解了文档中的陈述
  2. 是的,但是读取“Phone”的更改历史记录将为您提供相同的后续对象(因为只有 emp_id 会更改)
  3. 不,目前无法更改此行为。除非你例如将映射更改为双向一对多关系

关于hibernate - 恩弗斯 : Unidirectional OneToMany without additional audit table?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19795660/

相关文章:

java - 将 mysql 查询转换为 hibernate 查询

Java 监控数据库的变化 - Hibernate 和 envers

hibernate - 如何在Grails 3中将属性传递给Enver?

hibernate - WildFly8.2.0.Final、Hibernate、Infinispan : org. hibernate.cache.CacheException:不支持的访问类型 [读写]

java - 如何让Hibernate只查询默认映射?

java - 无法用jpa+spring boot创建表

java - Hibernate 为 MySQL 生成错误的内部连接查询

java - 防止 Hibernate 关系表被审计

jakarta-ee - 在@MappedSuperclass 中定义@UniqueConstraint

hibernate - 我如何在 QueryDSL 中使用强制索引?