带@Audited 的基本模型

Base model with @Audited

我为我的基本模型使用@Audited 注释。我将其扩展到我的所有实体。但它不起作用。有什么方法可以使用

这是我的基础模型

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

这是我的模型class

@Entity
public class City extends BaseModelObject {

    private static final long serialVersionUID = 1L;

    @Column
    private String name;
 }

试试这个:

超级class:

@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class AuditableEntity implements Serializable {

    private static final long serialVersionUID = 1L;

    @CreatedDate
    private LocalDateTime createdDate;

    @LastModifiedDate
    private LocalDateTime lastModifiedDate;

    @CreatedBy
    private String createdBy;

    @LastModifiedBy
    private String lastModifiedBy;

    ...
 }

实体class:

@Entity
public class City extends AuditableEntity {

    @Id

    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    ...
}

配置:

@EnableJpaAuditing
@SpringBootApplication
@EnableTransactionManagement
@EntityScan("foo.entities")
@ComponentScan("foo")
@EnableJpaRepositories("foo.repositories")
public class ConfigApp {

    ...
}

审计服务:

@Service
public class AuditorServiceImpl implements AuditorAware<String> {

    @Override
    public String getCurrentAuditor() {
        return SecurityContextHolder.getContext().getAuthentication().getName();
    }
}

@Audited 注释没有按照您认为的那样工作。通过在super class上使用它,它对扩展它的child classes没有影响,至少可以控制child 是否是 未被 审核。这是设计使然。

考虑我们有一个 superclass 类型和两个不同实现的概念,一个我们想用它的 superclass 属性审计,一个我们不想审计。

@MappedSuperclass
@Audited
public class Animal {}

@Entity
@Audited
public class Cat extends Animal {}

@Entity
public class Dog extends Animal {}

在这个例子中,由于 @Audited 不是继承的,仅仅将注释放在 superclass 和 Cat 实体上只会导致 Cat 被审计. Dog 实体及其超 class 属性 值不是。

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

@MappedSuperclass
public class Animal {}

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

@Entity
public class Dog extends Animal {}

更糟糕的是,如果 Animal 对其属性的子集进行了审核,这将影响 @AuditOverride 的数量。

当您开始研究实体继承策略以及这些策略如何影响是否审计实体,以及在层次结构的哪个级别达到何种程度时,这会变得更加复杂。

整个讨论 HHH-6331 and HHH-9770

简而言之,如果您希望对 child class 进行审核,则需要对其进行明确注释。