【发布时间】:2019-04-05 15:03:39
【问题描述】:
我想更新实体的某些字段,然后返回更新后的实体。相应的表有一个更新触发器,它在列中设置当前时间戳(我想在数据库级别而不是通过 JPA 执行此操作)。
首先,我使用实体管理器的 find() 方法通过其 ID 检索现有实体,然后使用实体的设置器更新一些字段。但是,当我返回实体时,我的 Java 实体的更新列/字段没有更新,即使它是通过更新触发器在数据库表中更新的。
我在设置更改的值后尝试了实体管理器的 refresh() 方法,但这似乎使我的所有更改无效(可能是因为实体尚未提交?)。
1) 除了让事务提交然后使用 find() 再次检索实体之外,还有更好的方法来获取正确的值吗?
2) 我不确定如何在我的实体中注释“上次更改”列。注释仅由数据库触发器更改的字段的最佳方法是什么?现在我正在使用(因为我只希望数据库触发器更新这个字段):
@Column(name = "last_changed", nullable = false, insertable = false, updatable = false)
有人对此有一些有用的意见吗?任何帮助表示赞赏,谢谢!
【问题讨论】:
-
调用 setter 不会向数据库写入任何内容,因此不会执行触发器。写入数据库的是 flush() 操作(在提交之前自动调用,并且在执行一些查询之前,其结果取决于挂起的更改)。所以你需要先调用flush(),然后再调用refresh()。这显然会比在没有触发器的情况下在 Java 中使用它更慢且效率更低
-
@JBNizet 谢谢,这就是我想要的。我忘了我可以在不先提交的情况下刷新。