基础模型与@Audited

时间:2016-12-23 09:10:42

标签: spring hibernate spring-boot hibernate-envers

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

2 个答案:

答案 0 :(得分:5)

@Audited注释并不像您认为的那样工作。通过在超类上使用它,它对扩展它的子类没有影响,至少可以控制子 是否审计。这是设计的。

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

@MappedSuperclass
@Audited
public class Animal {}

@Entity
@Audited
public class Cat extends Animal {}

@Entity
public class Dog extends Animal {}

在此示例中,由于@Audited未被继承,因此仅将注释放在超类上,而Cat实体只会审核CatDog实体及其超类属性值不是。

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

@MappedSuperclass
public class Animal {}

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

@Entity
public class Dog extends Animal {}

更糟糕的是,Animal审核了其属性的子集,这会影响@AuditOverride的数量。

当您开始查看实体继承策略以及这些策略是如何审核实体以及在层次结构的什么级别发挥作用时,这变得更加复杂。

整个讨论HHH-6331HHH-9770

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

答案 1 :(得分:2)

试试这个:

超类:

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