检索映射表的修订 - Hibernate Envers
Retrieve Revisions of Mapping Tables - Hibernate Envers
我在 Envers 4.3.6 FINAL 中使用 Hibernate。我已经使用注释设置了审计,当我在我的应用程序中保存信息时,我的所有审计 table 都已创建并正确填充。我的审计实体之一具有到其他实体的映射 table,具有 @ManyToMany 配置。
雇主 -> 职务
雇主可以有 0 到 n 个与之关联的指定实体。映射 table 是标准的,只有两列,雇主的外键 table 和指定的外键 table。 Envers 为此映射 table 创建了审计 table 并适当记录了记录,在编辑雇主时使用与雇主相同的 REV 输入插入或删除。
我现在要做的是从数据库中检索审计信息,以便我可以将其呈现以用于报告目的。正在检索我的雇主的修订列表,并且雇主的给定修订状态是准确的。我一直无法弄清楚的是如何检索映射 table 的审核。我没有这些配对的实际实体。它们使用 javax.persistence.JoinTable 注释放在一起。因此,我的 REVCHANGES table 中没有实体记录(我将 org.hibernate.envers.track_entities_changed_in_revision 设置为 true)。查看数据库,有我的 EmployerDesignations 映射 table 和相应的 EmployerDesignations_AUD 审计 table 的记录,但我不知道如何检索这些审计记录,甚至不知道何时它们已针对给定的修订版进行了更改。
如何检索映射 table 的审核历史记录?
雇主class:
@Entity
@DynamicInsert
@DynamicUpdate
@SelectBeforeUpdate
@Table(name="EMPLOYERS")
@Audited
public class Employer implements Serializable {
//All other fields omitted for brevity
...
private List<Designations> designations;
@ManyToMany
@JoinTable(name = "EMPLOYERDESIGNATIONS",
joinColumns = { @JoinColumn(name = "FK_EMPLOYER", nullable = false) },
inverseJoinColumns = { @JoinColumn(name = "FK_DESIGNATION", nullable = false) })
public List<Designations> getDesignations() {
return designations;
}
public void setDesignations(List<Designations> designations) {
this.designations= designations;
}
}
名称class:
@Entity
@DynamicInsert
@DynamicUpdate
@SelectBeforeUpdate
@Table(name="DESIGNATIONS")
@Audited
public class Designation implements Serializable {
//All other fields omitted for brevity
...
private List<Employer> employers;
@ManyToMany
@JoinTable(name = "EMPLOYERDESIGNATIONS",
joinColumns = { @JoinColumn(name = "FK_DESIGNATION", nullable = false) },
inverseJoinColumns = { @JoinColumn(name = "FK_EMPLOYER", nullable = false) })
public List<Employer> getEmployers() {
return employers;
}
public void setEmployers(List<Employer> employers) {
this.employers= employers;
}
}
审计数据检索测试代码:
List<Number> revisions = reader.getRevisions(Employer.class, employerId);
System.out.println(revisions);
for (Number revisionNum : revisions) {
Employer employer = reader.find(Employer.class, employerId, revisionNum);
System.out.println(employer);
}
您需要做的就是检索 Employer
实例,然后简单地访问关联的 getter,并且实体被审计时关联的任何状态都将自动可用。
如果我们假设在 Envers 环境中的第一个操作是您创建一个 Employer
并通过您的连接将它与两个 Designation
实体相关联,那么当您获取 Employer
实例时对于修订版 1,该集合将包含两个元素。
稍后在事务 2 中,您修改 Employer
并删除一个 Designation
并向实体添加一个新的 Designation
,然后当您获取 Employer
在修订版 2 中,它仍将包含两个 Designation
实体实例,但这些实例将是第一个修订版中保留的实例和您作为第二个修订版的一部分添加的第二个实例。
我在 Envers 4.3.6 FINAL 中使用 Hibernate。我已经使用注释设置了审计,当我在我的应用程序中保存信息时,我的所有审计 table 都已创建并正确填充。我的审计实体之一具有到其他实体的映射 table,具有 @ManyToMany 配置。
雇主 -> 职务
雇主可以有 0 到 n 个与之关联的指定实体。映射 table 是标准的,只有两列,雇主的外键 table 和指定的外键 table。 Envers 为此映射 table 创建了审计 table 并适当记录了记录,在编辑雇主时使用与雇主相同的 REV 输入插入或删除。
我现在要做的是从数据库中检索审计信息,以便我可以将其呈现以用于报告目的。正在检索我的雇主的修订列表,并且雇主的给定修订状态是准确的。我一直无法弄清楚的是如何检索映射 table 的审核。我没有这些配对的实际实体。它们使用 javax.persistence.JoinTable 注释放在一起。因此,我的 REVCHANGES table 中没有实体记录(我将 org.hibernate.envers.track_entities_changed_in_revision 设置为 true)。查看数据库,有我的 EmployerDesignations 映射 table 和相应的 EmployerDesignations_AUD 审计 table 的记录,但我不知道如何检索这些审计记录,甚至不知道何时它们已针对给定的修订版进行了更改。
如何检索映射 table 的审核历史记录?
雇主class:
@Entity
@DynamicInsert
@DynamicUpdate
@SelectBeforeUpdate
@Table(name="EMPLOYERS")
@Audited
public class Employer implements Serializable {
//All other fields omitted for brevity
...
private List<Designations> designations;
@ManyToMany
@JoinTable(name = "EMPLOYERDESIGNATIONS",
joinColumns = { @JoinColumn(name = "FK_EMPLOYER", nullable = false) },
inverseJoinColumns = { @JoinColumn(name = "FK_DESIGNATION", nullable = false) })
public List<Designations> getDesignations() {
return designations;
}
public void setDesignations(List<Designations> designations) {
this.designations= designations;
}
}
名称class:
@Entity
@DynamicInsert
@DynamicUpdate
@SelectBeforeUpdate
@Table(name="DESIGNATIONS")
@Audited
public class Designation implements Serializable {
//All other fields omitted for brevity
...
private List<Employer> employers;
@ManyToMany
@JoinTable(name = "EMPLOYERDESIGNATIONS",
joinColumns = { @JoinColumn(name = "FK_DESIGNATION", nullable = false) },
inverseJoinColumns = { @JoinColumn(name = "FK_EMPLOYER", nullable = false) })
public List<Employer> getEmployers() {
return employers;
}
public void setEmployers(List<Employer> employers) {
this.employers= employers;
}
}
审计数据检索测试代码:
List<Number> revisions = reader.getRevisions(Employer.class, employerId);
System.out.println(revisions);
for (Number revisionNum : revisions) {
Employer employer = reader.find(Employer.class, employerId, revisionNum);
System.out.println(employer);
}
您需要做的就是检索 Employer
实例,然后简单地访问关联的 getter,并且实体被审计时关联的任何状态都将自动可用。
如果我们假设在 Envers 环境中的第一个操作是您创建一个 Employer
并通过您的连接将它与两个 Designation
实体相关联,那么当您获取 Employer
实例时对于修订版 1,该集合将包含两个元素。
稍后在事务 2 中,您修改 Employer
并删除一个 Designation
并向实体添加一个新的 Designation
,然后当您获取 Employer
在修订版 2 中,它仍将包含两个 Designation
实体实例,但这些实例将是第一个修订版中保留的实例和您作为第二个修订版的一部分添加的第二个实例。