测试环境中的 JPA @PrePersist
JPA @PrePersist in test environment
我有 GenericEntity
class 和 @PrePersist
方法 onCreate()
,它在将实体保存到数据库之前设置时间戳。它运行良好,但当我尝试测试我的 DAO classes 时,我遇到了问题。 @PrePersist
在保存实体时覆盖明确设置的 created
字段值。如何在测试环境中使 @PrePersist 可选,以便我可以显式设置 created
字段值?
@MappedSuperclass
public abstract class GenericEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", updatable = false, nullable = false)
private Long id;
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "created", nullable = false)
private Date created;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@PrePersist
protected void onCreate() {
created = new Date();
}
/*
* Used for tests
*/
public void setCreated(Date created) {
this.created = created;
}
public Date getCreated() {
return created;
}
}
如果您授予访问设置创建值的权限(通过 setter),则不应在 @PrePersist
方法中覆盖该值。我认为解决问题的最简单方法是简单的空检查:
@PrePersist
protected void onCreate() {
if (created == null) {
created = new Date();
}
}
我有 GenericEntity
class 和 @PrePersist
方法 onCreate()
,它在将实体保存到数据库之前设置时间戳。它运行良好,但当我尝试测试我的 DAO classes 时,我遇到了问题。 @PrePersist
在保存实体时覆盖明确设置的 created
字段值。如何在测试环境中使 @PrePersist 可选,以便我可以显式设置 created
字段值?
@MappedSuperclass
public abstract class GenericEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", updatable = false, nullable = false)
private Long id;
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "created", nullable = false)
private Date created;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@PrePersist
protected void onCreate() {
created = new Date();
}
/*
* Used for tests
*/
public void setCreated(Date created) {
this.created = created;
}
public Date getCreated() {
return created;
}
}
如果您授予访问设置创建值的权限(通过 setter),则不应在 @PrePersist
方法中覆盖该值。我认为解决问题的最简单方法是简单的空检查:
@PrePersist
protected void onCreate() {
if (created == null) {
created = new Date();
}
}