【问题标题】:Base model with @Audited带有@Audited 的基本模型
【发布时间】:2017-05-08 23:30:02
【问题描述】:

我为我的基本模型使用@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;
}

这是我的模型类

@Entity
public class City extends BaseModelObject {

    private static final long serialVersionUID = 1L;

    @Column
    private String name;
 }

【问题讨论】:

    标签: spring hibernate spring-boot hibernate-envers


    【解决方案1】:

    试试这个:

    超类:

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

    实体类:

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

    【讨论】:

    • 这个使用 JPA 进行审计。在这种方法中我遇到了大问题。因为数据写在同一张表中。无法获取历史数据。在 Hibernate Envers 中也提供历史数据。这个问题基于 Hibernate Envers。我们可以同时使用两者。 baeldung.com/database-auditing-jpa
    【解决方案2】:

    @Audited 注释没有按照您认为的方式工作。通过在超类上使用它,它对扩展它的子类没有影响,至少可以控制子类还是审计。这是设计使然。

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

    @MappedSuperclass
    @Audited
    public class Animal {}
    
    @Entity
    @Audited
    public class Cat extends Animal {}
    
    @Entity
    public class Dog extends Animal {}
    

    在本例中,由于 @Audited 没有被继承,因此仅将注释放在超类和 Cat 实体上只会导致 Cat 被审计。 Dog 实体及其超类属性值不是。

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

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

    更糟糕的是,如果 Animal 对其属性的一部分进行审计,这将影响 @AuditOverrides 的数量。

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

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

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

    【讨论】:

    • 我们可以将审计数据存储在单独的数据库中而不是主数据库中吗?
    • 根据您的数据库,您可以在配置属性中将catalogschema 设置指定为全局或基于每个审计实体。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多