以下数据库架构:
员工[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 开发人员指南中,我找到了以下文本:
当使用这两个(@OneToMany+@JoinColumn)注释映射集合时,Hibernate 不会生成连接表。然而,Envers 必须这样做,这样当您阅读相关实体已更改的修订版时,您就不会得到错误的结果。
这是我对这段文字的解释: 我的员工实体可能属于许多电话实体。例如,如果我向某个员工添加电话,那么我的员工就会被修改,因此必须进行审核条目。使用上面的映射,这将导致电话实体的审核条目,而不是员工的审核条目。使用链接表可以解决此问题(因为该表描述了员工拥有的电话集合中的更改)。
现在我的3个问题:
注意:我问这个问题只是因为我想知道是否可以摆脱额外的链接表并更好地理解为什么需要它。
谢谢!