[英]How to retrieve the newest(current) time value specificd by DEFAULT CURRENT_TIMESTAMP on jpa entity's property?
我有一个 JPA 实体,其中包含两列, createdTime
和modifiedTime
。 我想使用 MySQL 的DEFAULT CURRENT_TIMESTAMP
功能来为这两列生成正确的时间值,所以我写了我的实体类,如:
@Entity
public class Blog {
// ...
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "created_time", updatable = false, insertable = false, nullable = false,
columnDefinition = "datetime default CURRENT_TIMESTAMP")
private Date createdTime;
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "modified_time", updatable = false, insertable = false, nullable = false,
columnDefinition = "datetime default CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP")
private Date modifiedTime;
}
然后我对我的应用程序做了一些实验,当我检查数据库时,数据库中这两列的值被正确更新。
但是,当我检查BlogRepository::save
返回的 java 实体时,这两列的值不是最新的值。 例如,当我插入一个新的Blog
实体时, BlogRepository::save
返回值上的这两个属性为 null。
我读过一些像https://stackoverflow.com/a/12237110/8510613这样的帖子,明白如果我将该列标记为updatable = false
,这种情况就会发生。 那么我应该如何解决这个问题? 简单地去掉updatable = false
/ insertable = false
似乎没有帮助,但会触发列的非空约束冲突。 但是,如果我删除这两列上的非空约束,则这两列的值只是空值。
在这种情况下,您应该使用@Generated注释。
2.3.18. 生成的属性
生成的属性是其值由数据库生成的属性。 通常,Hibernate 应用程序需要刷新包含数据库为其生成值的任何属性的对象。 然而,将属性标记为已生成,可以让应用程序将此责任委托给 Hibernate。 当 Hibernate 为已定义生成属性的实体发出 SQL INSERT 或 UPDATE 时,它会立即发出选择以检索生成的值。
所以,你应该像这样更正你的映射:
@Temporal(TemporalType.TIMESTAMP)
@Generated(value = GenerationTime.INSERT)
@Column(name = "created_time", updatable = false, insertable = false, nullable = false,
columnDefinition = "datetime default CURRENT_TIMESTAMP")
private Date createdTime;
@Temporal(TemporalType.TIMESTAMP)
@Generated(value = GenerationTime.ALWAYS)
@Column(name = "modified_time", updatable = false, insertable = false, nullable = false,
columnDefinition = "datetime default CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP")
private Date modifiedTime;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.