持久化后 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 为空的主要内容,如果未能解决你的问题,请参考以下文章

如何知道一个分离的 JPA 实体是不是已经被持久化?

工作流中的数据持久化详解!Activiti框架中JPA的使用分析

如何使用 JPA 获取最后一个持久化实体的 ID

传递给持久化的分离实体:JPA 继承

如何持久化具有两级 oneToMany 关系的 JPA 实体?

无法使用带有 InhertanceType.JOINED 的 Spring JPA 持久化实体