测试环境中的 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();
    }
}