持久化后 JPA 实体 CreateTimestamp 为空
Posted
技术标签:
【中文标题】持久化后 JPA 实体 CreateTimestamp 为空【英文标题】:JPA Entity CreateTimestamp is null after persist 【发布时间】:2017-09-14 19:29:39 【问题描述】:我有一个实体,其字段名为 createTimestamp。这是由数据库在插入时创建的。 getter 看起来像这样:
@Column(name = "create_timestamp", columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP", insertable = false)
public ZonedDateTime getCreateTimestamp()
return createTimestamp;
但是,当我的服务调用 dao(spring 存储库)创建实体时,创建时间戳为空。
我的dao方法创建:
@Override
public int insert(AntennaSpec antennaSpec)
super.save(antennaSpec);
logger.info("Antenna Spec " + antennaSpec.getAntennaCode() + " created");
return antennaSpec.getAntennaSpecId();
我的 REST 资源类通过调用 create 方法调用服务来创建实体。该方法返回新创建的实体的 id。在资源中,然后我调用我的服务以返回传递 id 的实体,但创建时间戳为空。我为填充它所做的工作是在我的资源中,我已经分离了实体,然后再次获取实体。这可行,但我不喜欢将 detach
暴露给我的服务或资源类。
任何帮助将不胜感激。
【问题讨论】:
您能发布您的表格 DDL 吗?columnDefinition
在 hibernate 为你生成数据库时使用,如果你使用 liquibase 例如 DDL 必须不匹配。
道歉。我忘了提到休眠没有设置为我生成数据库。只是为了验证现有数据库是否适用于我的实体。
【参考方案1】:
这是春季创建时间戳的另一种方式:
@CreationTimestamp
@Column(name = "create_timestamp")
private Date createTimestamp;
【讨论】:
我使用 Java 8 的ZonedDateTime
而不是 Date,这似乎不适用于 @CreationTimestamp
【参考方案2】:
您可能希望将注释 @Temporal(TemporalType.TIMESTAMP)
添加到您的列中,如给出的答案 here 中所述。
请查看here,了解有关持久、保存、更新、合并和 saveOrUpdate 对不同对象状态的不同执行方式的更多信息。
【讨论】:
不幸的是,我没有使用java.util.Date
,而是使用ZonedDateTime
。【参考方案3】:
columnDefinition
只有让hibernate生成数据库才有效果;否则它只是被忽略。只需通过数据库迁移工具将您的列更改为所需的状态。
列定义
(可选)生成 DDL 时使用的 SQL 片段 列。 JPA JavaDoc
【讨论】:
【参考方案4】:这是另一种解决方案...!!!
@CreationTimestamp
private LocalDateTime createTime;
@UpdateTimestamp
private LocalDateTime updateTime;
不要忘记使用.. !!
" @EntityListeners(AuditingEntityListener.class) "
这样使用--
It is just Entity
【讨论】:
以上是关于持久化后 JPA 实体 CreateTimestamp 为空的主要内容,如果未能解决你的问题,请参考以下文章
工作流中的数据持久化详解!Activiti框架中JPA的使用分析