首页 > 解决方案 > JPA / Hibernate CreationTimestamp 不适用于 PrimaryKeyJoinColumn

问题描述

我正在尝试使用@CreationTimestamp来自动设置新实体的创建日期,但由于某种原因它似乎无法正常工作。

ERROR: null value in column "created_at" violates not-null constraint

在实体中,我已经定义了这样的注释。

@CreationTimestamp
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "CREATED_AT", nullable = false)
private Date createdAt;

Liquibase 迁移文件:

<property name="date.type" value="TIMESTAMP WITH TIME ZONE" dbms="postgresql" />

<createTable tableName="USER">
    <column name="ID" type="${uuid_type}"><constraints nullable="false"/></column>
    <column name="CREATED_AT" type="${date.type}"><constraints nullable="false"/></column>
</createTable>

以及我坚持实体的方式。

@Transactional(propagation = Propagation.REQUIRED)
public E insert(E e) {
    entityManager.persist(e);
    entityManager.flush();
    return e;
}

当我createdAt手动设置日期时,该代码有效。但它不会自动生成注释应该做什么。谁能指出我为什么不呢?!

标签: javahibernatejpa

解决方案


当我在这里寻找答案时,我遇到了同样的问题。这就是我对其进行注释以使其工作的方式:

@CreationTimestamp
@Column(name = "created", nullable = false, updatable = false)
@Temporal(TemporalType.TIMESTAMP)
private Date created;

我认为这里的重要部分是该列被定义为不可“更新” - 因此更新行时该值不会改变。因为如果它在“可更新”的地方,那么 JPA 将不会生成该值。

但是,我也设置了“insertable = false”,这是错误的,因为 JPA 尝试使用 null 值将其持久化,这会引发错误,因为该列设置为 NOT NULL。


推荐阅读