使用带有 @Embeddable 类的 Spring Data 审计注释

Posted

技术标签:

【中文标题】使用带有 @Embeddable 类的 Spring Data 审计注释【英文标题】:Using Spring Data audit annotations with na @Embeddable class 【发布时间】:2018-12-30 20:31:52 【问题描述】:

我想使用 Spring Data 自动化实体审计(Spring 提供:@EnableJpaAuditing、AuditingEntityListener、@CreatedBy、@CreatedDate、@LastModifiedBy、@LastModifiedDate)并且将这些注解所注解的字段设为@Embeddable 类的一部分,我可以将其用作要审核的实体中的字段。这是一个示例 - 我只显示相关代码,它会编译并运行:

实体:

@EntityListeners(AuditingEntityListener.class)
public class EntityA 

    ...

    @Embedded
    private AuditFields audit;

带有审计字段的可嵌入类:

@Embeddable
public class AuditFields 

    ...     

    @Column(...)
    @CreatedDate
    private LocalDateTime createdDate;

我在配置类上有@EnableJpaAuditing,审计已开启,我已验证所有使用@EntityListeners(AuditingEntityListener.class) 注释的类都在调用 AuditingEntityListener。

想为审计字段使用@MappedSuperclass,然后在每个实体中扩展它,因为对我来说这完全违反了类继承代表什么的想法。

不想创建自己的实体实现的接口,这会将审计字段暴露给某个自定义实体侦听器(如果是这种情况,我什至可以使用 Spring 的 Auditable接口并获得相同的结果,因为 AuditingEntityListener 会很容易地选择它)。使用这个解决方案使四个字段注释毫无意义,因为我手动公开了这些字段供 Spring 使用。

看看它是如何在 Spring 中实现的,AuditingHandler 扫描由 AuditingEntityListener 拾取的每个实体,以查找它是否实现了 Auditable,或者通过一些花哨的包装等,查找由四个审计字段的注释所注释的字段。它不查看嵌入的对象及其字段。

使用@EntityListeners 注释对@Embeddable 类本身进行注释没有任何作用——可以预见的是,它没有注册为实体,所以为什么要为此调用任何实体侦听器。

我使用 Spring 的审计功能的想法是否可行?也许我错过了一些配置 Spring 的方法,以便在扫描实体中的审计注释时也考虑实体中的嵌入对象?

或者我只是坚持使用我自己的界面和我自己的实体监听器? Spring 的 Auditable 接口为我的简单用例公开了许多我不需要的方法,我可以在其中获取和设置嵌入式对象。我会重新创建自己的接口和侦听器。

【问题讨论】:

【参考方案1】:

您很可能拥有旧版本的 SpringDataJap。

我不知道它是在哪个版本中引入的,但是对于 1.11 版本它不起作用,对于 2.22 版本它可以。

【讨论】:

以上是关于使用带有 @Embeddable 类的 Spring Data 审计注释的主要内容,如果未能解决你的问题,请参考以下文章

带有@EmbeddedId 和@Embeddable 的EclipseLink 组合键

自动为@Embeddable类的列名添加前缀

01-hibernate注解:类级别注解,@Entity,@Table,@Embeddable

Hibernate OGM 映射本机查询的@Embeddable 对象

Spring 和 Hibernate3 的 @Embeddable 问题

Hibernate OGM映射本地查询的@Embeddable对象