Spring Data JPA中的审核和@Embedded

jpvee

我在JPA审核和@Embedded会员方面遇到问题请考虑以下示例方案:

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

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

@Entity通过审核定义了JPA

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

}

最后,我在以下位置启用JPA审核@Configuration

@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类的同时保存审核功能的方法

TheKoju效应

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

尚不支持嵌套(可嵌入)类中的Spring Data审计注释。这是要求此功能的吉拉票

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

以下是从博客中获取的示例实现:如何使用JPA @ EntityListeners,@ Embedded和@Embeddable批注来审计实体修改

嵌入式审计

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

  }

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章