在执行删除操作时,在数据库中保留时,很少有字段未被审核其值为 null

While doing delete operation few fields are not audited its take value as null while persisting in db

使用 Hibernate Envers,在执行创建操作时审计功能正常工作数据在主审计和审计中正确填写 table 但是 删除 几个字段的条目它取空以下是代码示例:

@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;
}

所有 classes 都用 @Audited 注释,当删除操作被触发时 Class B 数据没有得到正确的审计。与 embeddedId(复合主键)对应的数据反映在审计 table 中,但其他数据,如(代码、ID、用户、时间),即 class 的成员变量以及来自继承的数据正在发生在审计中为 null table.

由于我是 Envers 的新手,请提供此问题的详细解决方案。

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

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

您在提供其他休眠配置属性的地方设置此配置。

只是一个小补充: 在我们使用 spring 引导和 Hibernate 的环境中——以下变量成功了(因为这里提供的变量没有——但给了我关于如何解决它的想法):

spring.jpa.properties.org.hibernate.envers.store_data_at_delete=真