在执行删除操作时,很少有字段未经过审计,因此在db中保留时,其值为null

时间:2017-05-10 13:58:43

标签: java mysql hibernate jboss hibernate-envers

使用 Hibernate Envers ,在执行创建操作审核功能时,正常工作数据在主表和审核表中正确填充,但在删除时为少数字段添加条目以下是代码示例:

@Audited
@MappedSuperclass
public abstract class A implements Serializable
{
private static final long   serialVersionUID    = 1L;
@NotNull
private Long                id;
@NotNull
private String              user;   
private Timestamp           time;
}

@Entity
@Audited
public class B extends A
{
private static final long               serialVersionUID    = 1L;

@EmbeddedId
private EmbeddedId  embeddedId;

@ManyToOne
@JoinColumn(name = "CODE")
private Code                    code;
}

@Audited
@Embeddable
public class EmbeddedId implements Serializable
{
private static final long                   serialVersionUID    = 1L;

@ManyToOne
@JoinColumn(name = "C")
private C                       c;

@ManyToOne(optional = false)
@JoinColumns(value =
{ @JoinColumn(name = "C_ID", referencedColumnName = "C_ID"),
        @JoinColumn(name = "D_ID", referencedColumnName = "D_ID") })
private D   d;

}   

@Entity
@Audited
public class Code extends A
{
private static final long   serialVersionUID    = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long                cId;

private String              name;
}

所有类都使用@Audited 注释,当删除操作被触发时,B类数据未正确审核。与embeddedId(复合主键)对应的数据反映在审计表中,但其他数据(如代码,id,用户,时间),即该类的成员变量以及来自继承的数据在审计表中都为空。

请提供详细的解决方案,因为我是Envers的新手。

1 个答案:

答案 0 :(得分:1)

如果您希望在执行DELETE操作时存储非标识符属性,则必须明确告知Envers您希望启用此行为,因为默认情况下它不会这样做。

只需将配置org.hibernate.envers.store_data_at_delete切换为true,Envers就会在DELETE数据库操作期间开始捕获并存储非标识符审核属性。

您可以在此处配置其他hibernate配置属性。