spring - Spring Data JPA 中的审计和@Embedded

标签 spring jpa spring-data-jpa

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

我在 Oracle DB 中设置了一个测试表:

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

  }

关于spring - Spring Data JPA 中的审计和@Embedded,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38244498/

相关文章:

java - 如何通过实现自动连接接口(interface)

java - Jpa多对多我怎样才能将数据插入2个表

java - 嵌套异常是 java.lang.NoClassDefFoundError : org/hibernate/boot/registry/classloading/internal/ClassLoaderServiceImpl$Work

java - @Service 中的@Autowired?

java - 找不到 spring 主页

java - Hibernate:按内部列表的值过滤实体的结果列表

java - 更新实体 (JPA+MySQL) - key '142' 的重复条目 'PRIMARY'

java - 要求属性在模型中具有值,不允许为 null

java - 具有 JPA 持久性的 Spring 状态机 - 存储库使用

java - 检索网址