我有一个带字段的实体
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "edit_timestamp",
columnDefinition="TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP")
private Date editTimestamp;
@Version
@Column(name = "edit_count")
private short editCount;
private String text;
字符串
当我尝试使用Spring-Data-JPA进行更新时,我观察到edit_count已经增加,但edit_timestamp仍然保持不变。
UPDATE post SET TEXT='456' WHERE post_id=1;
型
edit_timestamp更新。如果我添加
@PreUpdate
protected void onUpdate() {
editTimestamp = new Date();
}
型
它工作w/o问题.我的问题是为什么w/o @PreUpdate的edit_timestamp没有更新?
4条答案
按热度按时间3ks5zfa01#
您需要更改列注解以包含updatable = false。这将导致edit_timestamp列不会显示在更新SQL中,因此JPA提供程序不会包含导致其覆盖默认值的字段的当前值。
字符串
1yjd4xko2#
你可以在你的实体中将变量标记为更新或创建时间戳。在下面的例子中,你可以看到如何使用hibernate annotations非常容易地做到这一点:
字符串
只是为了参考,并确保没有混淆,我使用以下包导入各自的数据库和注解:
型
4xrmg8kj3#
这里“created_date”字段默认设置在mysql与default/expression是“CURRENT_TIMESTAMP”see image file here.和在你的实体类如下-
字符串
5cg8jx4n4#
因为在你最初的一组注解中,你告诉它的关于edit_timestamp列的所有信息都是一个时间戳; JPA不知道它需要更新它。我猜当你手动执行SQL语句时,你有某种更新触发器为你改变这些字段-但是当你更新它时,它会被来自持久化实体的数据覆盖。
如果你不需要“编辑过的”计数/时间戳,试着从实体中删除它们,看看是否有效。否则,你就有了一个可行的解决方案。