基础模型与@Audited

wth*_*ira 2 spring hibernate hibernate-envers spring-boot

我使用@Audited annotation作为我的基本模型.我为所有实体扩展了它.但它不起作用.有什么方法我可以使用它

这是我的基本模型

@MappedSuperclass
@Getter
@Setter
@Audited 
public abstract class BaseModelObject implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = 4194525198831057382L;


    @Id     
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    protected Long id;
}
Run Code Online (Sandbox Code Playgroud)

这是我的模特课

@Entity
public class City extends BaseModelObject {

    private static final long serialVersionUID = 1L;

    @Column
    private String name;
 }
Run Code Online (Sandbox Code Playgroud)

Nar*_*ros 5

@Audited批注不工作,你认为它应该的方式.通过使用它的一个超类,它有哪些扩展它,至少要控制孩子是否子类没有影响不是审计.这是设计的.

考虑一下我们有一个超类类型和两个不同的实现的概念,一个我们要用它的超类属性来审计,另一个我们不用.

@MappedSuperclass
@Audited
public class Animal {}

@Entity
@Audited
public class Cat extends Animal {}

@Entity
public class Dog extends Animal {}
Run Code Online (Sandbox Code Playgroud)

在此示例中,由于@Audited未继承,因此仅将注释放在超类上,而Cat实体结果只是Cat被审计.在Dog实体和它的超类的属性值都没有.

如果@Audited被视为继承的注释,我们必须引入一系列@AuditOverride注释来完成相同的示例,见下文.

@MappedSuperclass
public class Animal {}

@Entity
@Audited
@AuditOverride(...)
public class Cat extends Animal {}

@Entity
public class Dog extends Animal {}
Run Code Online (Sandbox Code Playgroud)

更糟糕的是,如果Animal审计了其属性的子集,这会影响@AuditOverrides 的数量.

当您开始查看实体继承策略以及这些策略是如何审核实体或在何种程度上对层次结构进行审核时,这会变得更加复杂.

有一个完整的讨论HHH-6331HHH-9770.

简而言之,如果您希望对您的子类进行审核,则需要明确注释它们.