java - 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
手动设置日期时,该代码有效。但它不会自动生成注释应该做什么。谁能指出我为什么不呢?!
解决方案
当我在这里寻找答案时,我遇到了同样的问题。这就是我对其进行注释以使其工作的方式:
@CreationTimestamp
@Column(name = "created", nullable = false, updatable = false)
@Temporal(TemporalType.TIMESTAMP)
private Date created;
我认为这里的重要部分是该列被定义为不可“更新” - 因此更新行时该值不会改变。因为如果它在“可更新”的地方,那么 JPA 将不会生成该值。
但是,我也设置了“insertable = false”,这是错误的,因为 JPA 尝试使用 null 值将其持久化,这会引发错误,因为该列设置为 NOT NULL。
推荐阅读
- c# - 如何在 Visual Studio for Windows 中向 Winform 应用程序添加 Internet 权限
- android - Flutter:如何使用 JSON 数据从 ListView.builder 创建搜索栏?
- flutter - Flutter本地化和sdk可能不兼容android studio
- amazon-web-services - AWS Databricks Spark - 数据类型
- cherrypy - server.socket_host: '0.0.0.0' 有必要吗?
- reactjs - redux mapDispatchToProps 渲染
- go - 如何在 Go 中使用 Bazel 进行静态代码分析
- python - 映射列表到二进制数据
- javascript - Html 显示/隐藏密码不起作用 JavaScript 包括
- ocaml - esy:如何将#{self.target_dir}符号链接到_build?