jpa - JPA 实体管理器合并,对象没有变化
问题描述
当对象没有更改时,我正在尝试使用实体管理器的合并方法来更新数据库中的对象。假设该行具有以下属性:
id DECIMAL(11) NOT NULL,
name CHAR(20) NOT NULL,
lastModified TIMESTAMP NOT NULL FOR EACH ROW ON UPDATE AS ROW CHANGE TIMESTAMP
假设我在数据库中有一个具有以下属性的对象(我们称其为 Person):
{id: 1, name: "example", lastModified: 2019-05-22 16:24:54.771}
因此 lastModified 属性是每次行发生更改时数据库都会更新的属性。
现在,当我第一次获取对象,然后将人名更新为“example”(与数据库中已有的值相同),然后使用合并更新它时,lastModified 属性似乎没有更新在数据库中。IE
Person person = em.find(Person.class, 1)
person.setName("example")
em.merge(person)
经过上述操作,lastModified 仍然是 2019-05-22 16:24:54.771(与之前相同)。现在,如果我改名,即
Person person = em.find(Person.class, 1)
person.setName("new name")
em.merge(person)
所以现在 lastModified 也会更新。
这个有什么帮助吗?有人可以解释一下为什么当没有对对象进行更改时该行不会更新?:) 谢谢!
解决方案
当您使用 时merge
,Hibernate 首先在您尝试合并的元组中运行 Select 语句。执行此选择以获取元组的最新状态,然后使用元组中已更改的数据在数据库中运行更新。
正如您在示例中所说,您没有更改任何数据,因为您正在尝试将名称更新为与以前相同的名称,因此休眠不会对数据库运行任何更新。
您可以参考 Hibernate Dirty Checking Mechanism 了解更多相关信息。
如果您真的想在没有数据更改的情况下更新此列,则必须在应用程序层执行此操作,方法是在保存 Person 对象时手动设置:
person.setLastModified(LocalDateTime.now())
推荐阅读
- java - 如何将 JsonObject 存储到 Postgresql 数据库?
- python-3.x - SageMath:定义一系列函数(Callable Symbolic Expressions)
- javascript - Vue CLI 3 - 输入字符计数问题 v-model
- kubernetes - 无法访问 dapr 上的无头服务
- css - 如何在 Ipad 和移动断点上禁用此 CSS 代码?
- sql - Oracle for Microsoft SQL Server 数据库中 ENABLE 关键字的等效项是什么?
- heroku - 通过 Heroku 部署应用程序时的问题
- oracle - Oracle查询 - 如何根据它们的值将两个不同的行计为一个
- html - 更改底部 div 的背景颜色
- javascript - 如何将 2 个对象数组与额外匹配合并