Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate 数据库触发后刷新实体_Hibernate_Jpa - Fatal编程技术网

Hibernate 数据库触发后刷新实体

Hibernate 数据库触发后刷新实体,hibernate,jpa,Hibernate,Jpa,我想更新实体的一些字段,然后返回更新后的实体。对应的表有一个更新触发器,它在一个列中设置当前时间戳。我希望在数据库级别而不是通过JPA执行此操作 首先,我使用entitymanager的find方法通过其ID检索现有实体,然后使用实体的setter更新一些字段。但是,当我返回实体时,Java实体的更新列/字段没有更新,即使它是通过更新触发器在数据库表中更新的 在设置更改的值后,我尝试了entitymanager的刷新方法,但这似乎会使我的所有更改无效,可能是因为实体尚未提交 1除了让事务提交然后

我想更新实体的一些字段,然后返回更新后的实体。对应的表有一个更新触发器,它在一个列中设置当前时间戳。我希望在数据库级别而不是通过JPA执行此操作

首先,我使用entitymanager的find方法通过其ID检索现有实体,然后使用实体的setter更新一些字段。但是,当我返回实体时,Java实体的更新列/字段没有更新,即使它是通过更新触发器在数据库表中更新的

在设置更改的值后,我尝试了entitymanager的刷新方法,但这似乎会使我的所有更改无效,可能是因为实体尚未提交

1除了让事务提交然后使用find再次检索实体之外,还有更好的方法获取正确的值吗

2我不确定如何注释实体中最后更改的列。注释仅由数据库触发器更改的字段的最佳方法是什么?现在我正在使用,因为我只希望数据库触发器更新此字段:

@Column(name = "last_changed", nullable = false, insertable = false, updatable = false)
有人对此有什么有用的意见吗?感谢您的帮助,谢谢

1是否有更好的方法获得正确的值,而不是让 事务提交,然后使用 找到了吗

正如@JBNizet所评论的:所以您需要调用flush,然后刷新

2我真的不知道如何注释我的表中最后更改的列 实体注释仅更改的字段的最佳方式是什么 通过数据库触发器

除了将insertable和updateable设置为false的@Column注释外,还可以使用生成的hibernate注释@,如图所示
但是,这打破了任何只使用JPA的方法。

调用setter不会向数据库写入任何内容,因此不会执行触发器。写入数据库的是刷新操作,该操作在提交之前自动调用,也在执行某些查询之前调用,这些查询的结果取决于挂起的更改。所以你需要调用flush,然后刷新。这显然会比在Java中使用更慢、效率更低,而不使用trigger@JBNizet谢谢,这就是我要找的。我忘了我可以不先承诺就冲水。