我在 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/