我在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
类的同时保存审核功能的方法?
更新:此功能已添加到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] 删除。
我来说两句