9

以下数据库架构:

员工[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 Developerguide 中,我找到了以下文本:

当使用这两个 (@OneToMany+@JoinColumn) 注释映射集合时,Hibernate 不会生成连接表。然而,Envers 必须这样做,这样当您阅读相关实体已更改的修订时,您不会得到错误的结果。

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

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

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

谢谢!

4

2 回答 2

4
  1. 是的,您正确理解了文档中的声明
  2. 是的,但是阅读“电话”的变化历史会给你后续相同的对象(因为只有 emp_id 会改变)
  3. 不,目前无法更改此行为。除非您将映射更改为双向一对多关系
于 2013-11-06T10:03:01.290 回答
1

今天可以使用@AuditJoinTable注释它是非常古老的功能

Hibernate5.4 文档

于 2020-07-09T20:22:59.503 回答