Java 检索映射表的修订-Hibernate Envers

Java 检索映射表的修订-Hibernate Envers,java,hibernate-envers,Java,Hibernate Envers,我将Hibernate与Envers一起使用,最终版本为4.3.6。我已经使用注释设置了审核,并且在应用程序中保存信息时,所有审核表都已创建并正确填充。我的一个审计实体有一个到其他实体的映射表,配置为@ManyToMany 雇主->指定 雇主可以有0到n个与其关联的指定实体。映射表是标准的,只有两列,一个外键指向雇主表,另一个外键指向指定表。Envers为此映射表创建了一个审计表,并适当记录了记录,在编辑雇主时,插入或删除以与雇主相同的版本输入 我现在要做的是从数据库中检索审计信息,以便为报告目

我将Hibernate与Envers一起使用,最终版本为4.3.6。我已经使用注释设置了审核,并且在应用程序中保存信息时,所有审核表都已创建并正确填充。我的一个审计实体有一个到其他实体的映射表,配置为@ManyToMany

雇主->指定

雇主可以有0到n个与其关联的指定实体。映射表是标准的,只有两列,一个外键指向雇主表,另一个外键指向指定表。Envers为此映射表创建了一个审计表,并适当记录了记录,在编辑雇主时,插入或删除以与雇主相同的版本输入

我现在要做的是从数据库中检索审计信息,以便为报告目的呈现它。正在为我的雇主检索修订列表,并且给定修订的雇主状态是准确的。我没有弄清楚的是如何检索映射表的审计。我没有这些配对的实际实体。它们使用javax.persistence.JoinTable注释组合在一起。因此,我的REVCHANGES表中没有实体的记录(我正在将org.hibernate.envers.track_entities_changed_in_revision设置为true)。查看数据库,有my EmployeerDesignations映射表和相应的EmployeerDesignations_AUD audit表的记录,但我不知道如何检索这些审计记录,甚至不知道它们在给定版本中何时被更改

如何检索映射表的审核历史记录

雇主类别:

@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;
    }
}
@实体
@动态服务器
@动态铜日期
@选择BeforeUpdate
@表(name=“雇主”)
@审计
公共类实现可序列化{
//为简洁起见,省略了所有其他字段
...
私人名单的指定;
@许多
@JoinTable(name=“EMPLOYERDESIGNATIONS”,
joinColumns={@JoinColumn(name=“FK_雇主”,nullable=false)},
inverseJoinColumns={@JoinColumn(name=“FK_DESIGNATION”,nullable=false)})
公共列表getnamignations(){
返回指定;
}
公共无效设置名称(列表名称){
这个。名称=名称;
}
}
指定类别:

@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;
    }
}
@实体
@动态服务器
@动态铜日期
@选择BeforeUpdate
@表(名称=“名称”)
@审计
公共类指定实现了可序列化{
//为简洁起见,省略了所有其他字段
...
私人名单雇主;
@许多
@JoinTable(name=“EMPLOYERDESIGNATIONS”,
joinColumns={@JoinColumn(name=“FK_DESIGNATION”,nullable=false)},
inverseJoinColumns={@JoinColumn(name=“FK_雇主”,nullable=false)})
公开名单{
返回雇主;
}
公共雇主(列出雇主){
这就是:雇主=雇主;
}
}
审计数据检索的测试代码:

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);
}
List revisions=reader.getRevisions(Employer.class,employerId);
系统输出打印LN(修订版);
用于(编号修订编号:修订){
Employer=reader.find(Employer.class、employerId、revisionNum);
系统输出打印LN(业主);
}

您所需要做的就是检索
雇主
实例,然后简单地访问关联的getter,当实体被审计时关联的任何状态都将自动可用

如果我们假设Envers环境中的第一个操作是创建一个
雇主
,并通过join将其与两个
名称
实体关联,那么在获取修订版1的
雇主
实例时,集合将包含两个元素


稍后在事务2中,您修改了
雇主
,删除了一个
名称
,并向实体添加了一个新的
名称
,然后在第二次修订中获取
雇主
时,它仍将包含两个
名称
实体实例,但这些实例将是第一次修订后的实例,第二次修订是作为第二次修订的一部分添加的。

是否需要为此做一些特殊的工作?恐怕即使我直接使用getter,我的指定列表也是空的。通过中断代码,我看到指定列表实际上是org.hibernate.envers.internal.entities.mapper.relation.lazy.proxy.ListProxy.Correct的一个实例。它是一个代理,当以某种有意义的方式首次访问列表时,将加载该代理,例如获取其大小或元素。我一定在某种程度上做错了什么。我已尝试使用size()初始化列表,如您所述,如中所述,但结果列表为空。我知道有我正在测试的给定版本号的审计数据,但似乎根本没有填充指定列表。从代码角度看,这应该是可行的。请参阅我的要点,以获取一个示例,其中我模拟了您的实体,并且效果良好。了解你可能面临的是4.3中的一些问题,如果这是真的,你需要更新到5.2。谢谢。我将用4.3和5.2进行测试,看看这两个版本之间是否有任何差异。