java - 如何在 jpa 实体的属性上检索 DEFAULT CURRENT_TIMESTAMP 指定的最新(当前)时间值?
问题描述
我有一个 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;
}
然后我在我的应用程序上做了一些实验,当我检查数据库时,数据库中这两列的值被正确更新。
但是,当我检查 java 实体 return byBlogRepository::save
时,这两列的值不是最新值。例如,当我插入一个新实体时,我在返回值Blog
上为这两个属性得到 null 。BlogRepository::save
我读过一些类似https://stackoverflow.com/a/12237110/8510613的帖子,了解如果我将该列标记为updatable = false
,就会发生这种情况。那么我应该如何解决这个问题?简单地去掉updatable = false
/insertable = false
似乎没有任何帮助,反而会触发列的非空约束违规。但是,如果我删除这两个列上的 not null 约束,则这两个列的值只是 null。
解决方案
在这种情况下,您应该使用@Generated注释。
2.3.18。生成的属性
生成的属性是其值由数据库生成的属性。通常,Hibernate 应用程序需要刷新包含数据库为其生成值的任何属性的对象。然而,将属性标记为已生成,可以让应用程序将此责任委托给 Hibernate。当 Hibernate 为已定义生成属性的实体发出 SQL INSERT 或 UPDATE 时,它会立即发出 select 以检索生成的值。
因此,您应该更正您的映射,如下所示:
@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;
推荐阅读
- swiftui - swiftui 异步初始化
- python - Selenium webdriver 没有打开正确的 url,而是打开一个空白页面
- c# - C# 调用优化的 C++ dll 函数行为
- azure - Azure 函数转发警报
- c# - 循环脚本不更新其他表单
- javascript - 为附加到图像的链接拉出不同的样式,导致不需要的图层
- ios - SwiftUI按钮路径问题:运行时弹出无法识别的选择器错误
- java - WARN 无法为 url 创建文件系统 jar:file:/app.jar!/BOOT-INF/classes!/: null java.nio.file.FileSystemNotFoundException: null
- javascript - Redux useSelector 为嵌套值返回 undefined
- typescript - 在 TypeScript 中将类型从接口添加到类