使用Hibernate版本,在执行创建操作审计功能时正常工作,数据在主表和审计表中正确填充,但在删除少数字段的条目时,其空值如下代码示例:
@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、用户、时间(,即该类的成员变量以及来自继承的数据在审计表中显示为 null。
请提供此问题的详细解决方案,因为我是Envers的新手。
如果您希望在执行DELETE
操作时存储非标识符属性,则必须显式告诉 Envers 您希望启用此行为,因为默认情况下它不会这样做。
只需将配置org.hibernate.envers.store_data_at_delete
切换到true
,Envers 就会在DELETE
数据库操作期间开始捕获和存储非标识符审核的属性。
您可以在提供其他休眠配置属性的位置设置此配置。
只是一个小补充:在我们使用 spring boot 和 Hibernate 的环境中 - 以下变量起到了作用(因为这里提供的变量没有 dod - 但给了我有关如何解决它的想法(:
spring.jpa.properties.org.hibernate.envers.store_data_at_delete=true