【发布时间】: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