2017-09-28 110 views
1

我想在审计连接表时保存审计表中的连接列值。hibernate-envers onetomany加入类没有审计,但连接列需要审计

这是我的实体类。

审计类信息:

@Entity 
@Audited 
@Table(name = "INFO") 
public class Info extends AbstractEntity { 

    @Id 
    @Column(name = "ID") 
    private String id; 

    /*More Columns */ 

    @ManyToOne 
    @JoinColumns({ @JoinColumn(name = "FIRST_NAME", referencedColumnName = "FIRST_NAME"), 
     @JoinColumn(name = "LAST_NAME", referencedColumnName = "LAST_NAME") }) 
    @NotAudited 
    private Details details; 


} 

未经审计类:详细信息:

@Entity 
@Table(name = "DETAILS") 
public class Details extends AbstractEntity { 

    @EmbeddedId 
    private DetailsPK detailsPK; 
    /*More Columns */ 

} 

主键/连接字段的定义如下:

@Embeddable 
public class DetailsPK implements Serializable { 

    @Column(name = "FIRST_NAME") 
    private String firstName; 

    @Column(name = "LAST_NAME") 
    private String lastName; 

} 

这里,详细信息静态...它不会改变...因此,不需要审计......但是,当审计信息变化时,我想t INFO_AUD表来同时捕获名字和姓氏......有没有一种方法来指定它?

谢谢, 乔。

回答

0

既然你想要的字段是主键的一部分,你可以很容易地通过指定特别审计注释属性做到这一点:

@ManyToOne 
@Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED) 
private Details details; 

总之,这指示Envers关联实体Details不被审计单位;但是审计模式应该为相关实体的主键列创建一个快照。

因此您应该预计Info_AUD有两列,分别代表名称值details_FIRST_NAMEdetails_LAST_NAME

因为Envers会确保在更改与Info关联的Details对象时,您不需要对数据模型执行任何其他操作,因此名称列在历史行快照中相应地更新。

+0

Naros,感谢您的帮助...我试过上述解决方案...但审计表中的first_name和last_name仍然没有填充... 另外,我的假设是在您的代码中.. 。details.getId()方法是details.getDetailsPK()方法。我将getter和setter添加到INFO实体的阴影列中。 请指教...请问您还可以详细说明为什么我们需要在细节设置器中使用resolveAuditedShadowColumns方法... 我提前道歉,因为我对envers完全陌生并试图理解... – Joe

+0

@Joe我完全重写了答案。我之前的回答有点复杂,经过一些实验后,我发现了一个更好的解决方案,可以很好地满足您的需求,并避免任何不必要的开销。 – Naros

+0

在我发布我的问题之前,我尝试过这样做,但它没有工作......我重试以防万一......并且它仍然无法正常工作....以下是我尝试的代码行。 @ManyToOne @JoinColumns({@JoinColumn(名称= “FIRST_NAME”,referencedColumnName = “FIRST_NAME”), @JoinColumn(名称= “LAST_NAME”,referencedColumnName = “LAST_NAME”)}) @Audited(targetAuditMode = RelationTargetAuditMode 。NOT_AUDITED) 私人详情细节; 注:我的Info_Aud表具有FIRST_NAME和LAST_NAME列,但不包含details_First_name和details_last_name columsn。 – Joe