【问题标题】:Auditing and @Embedded in Spring Data JPASpring Data JPA 中的审计和@Embedded
【发布时间】:2016-07-07 11:38:36
【问题描述】:

我在 JPA 审计和@Embedded 成员方面遇到问题。考虑以下示例场景:

我在 Oracle 数据库中设置了一个测试表:

CREATE TABLE AUDIT_TEST (
  ID            NUMBER(38)   NOT NULL PRIMARY KEY,
  CREATION_DATE TIMESTAMP(6) DEFAULT SYSTIMESTAMP NOT NULL
);

我定义了一个带有审计功能的 JPA @Entity

@Entity
@EntityListeners(AuditingEntityListener.class)
@Table(name = "AUDIT_TEST")
public class AuditTest {

  private Long id;
  private LocalDateTime creationDate;

  @Id
  @Column(name = "ID")
  public Long getId() { return id; }

  public void setId(Long id) { this.id = id; }

  @CreatedDate
  @Column(name = "CREATION_DATE")
  public LocalDateTime getCreationDate() { return creationDate; }

  public void setCreationDate(LocalDateTime creationDate) {
    this.creationDate = creationDate;
  }

}

最后,我在@Configuration 中启用了 JPA 审计:

@SpringBootApplication()
@EnableJpaAuditing()
public class AuditTestApplication {
}

到目前为止一切顺利;当我构造一个 AuditTest 实例,为其分配一个 id 并提交时,creationDate 列将按预期填充当前时间戳。

但是,当我将审计列封装在 @Embeddable 中时,事情就停止了:

@Embeddable
public class AuditTestEmbeddable {

  private LocalDateTime creationDate;

  @CreatedDate
  @Column(name = "CREATION_DATE")
  public LocalDateTime getCreationDate() { return creationDate; }

  public void setCreationDate(LocalDateTime creationDate) {
    this.creationDate = creationDate;
  }

}

然后我更改我的实体类以嵌入创建日期:

@Entity
@EntityListeners(AuditingEntityListener.class)
@Table(name = "AUDIT_TEST")
public class AuditTest {

  private Long id;
  private AuditTestEmbeddable auditTestEmbeddable = new AuditTestEmbeddable();

  @Id
  @Column(name = "ID")
  public Long getId() { return id; }

  public void setId(Long id) { this.id = id; }

  @Embedded
  public AuditTestEmbeddable getAuditTestEmbeddable() {
    return auditTestEmbeddable;
  }

  public void setAuditTestEmbeddable(AuditTestEmbeddable auditTestEmbeddable) {
    this.auditTestEmbeddable = auditTestEmbeddable;
  }

}

不幸的是,审计不再有效。

这里有人知道在使用@Embedded 类的同时保存审计功能的方法吗?

【问题讨论】:

  • 信息必须在托管实体上(至少现在是这样完成和工作的)。所以目前没有其他方法可以直接将其添加到实体中。
  • 您好,所以唯一可用的选项是直接向每个实体添加所需字段,例如:用户创建者、用户更新者、创建日期、更新日期?对吗?

标签: spring jpa spring-data-jpa


【解决方案1】:

更新: 此功能已添加到 Spring Data 2.1 M2 (Lovelace)。 https://jira.spring.io/browse/DATACMNS-1274

目前尚不支持嵌套(可嵌入)类中的 Spring Data 审计注释。这是 the jira ticket 请求此功能。

但是,我们可以使用自定义审计侦听器在可嵌入类中设置审计信息。

以下是取自博客的示例实现:How to audit entity modifications using the JPA @EntityListeners, @Embedded, and @Embeddable annotations

嵌入式审计

@Embeddable
public class Audit {

    @Column(name = "created_on")
    private LocalDateTime createdOn;

    @Column(name = "created_by")
    private String createdBy;

    @Column(name = "updated_on")
    private LocalDateTime updatedOn;

    @Column(name = "updated_by")
    private String updatedBy;

    //Getters and setters omitted for brevity
}

审计监听器

public class AuditListener {

    @PrePersist
    public void setCreatedOn(Auditable auditable) {
        Audit audit = auditable.getAudit();

        if(audit == null) {
            audit = new Audit();
            auditable.setAudit(audit);
        }

        audit.setCreatedOn(LocalDateTime.now());
        audit.setCreatedBy(LoggedUser.get());
    }

    @PreUpdate
    public void setUpdadtedOn(Auditable auditable) {
        Audit audit = auditable.getAudit();

        audit.setUpdatedOn(LocalDateTime.now());
        audit.setUpdatedBy(LoggedUser.get());
    }
}

可审核

public interface Auditable {

    Audit getAudit();

    void setAudit(Audit audit);
}

示例实体

@Entity
@EntityListeners(AuditListener.class)
public class Post implements Auditable {

    @Id
    private Long id;

    @Embedded
    private Audit audit;

    private String title;

  }

【讨论】:

    【解决方案2】:

    使用 spring-data 2.4.4,AuditListener 可以很好地处理嵌入式对象,请参阅 documentation spring-data

    spring-data的最小版本捆绑在spring-boot 2.4.3版本

    【讨论】:

    • 你有一个有效的例子吗?文档不是很广泛,似乎不适用于最新的 spring boot 2.6.2 :-(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-02
    • 1970-01-01
    • 2015-01-20
    • 1970-01-01
    • 2017-07-09
    • 2016-08-22
    • 2018-02-04
    相关资源
    最近更新 更多