gpt4 book ai didi

JPA 实体管理器合并,对象中没有任何更改

转载 作者:行者123 更新时间:2023-11-29 04:09:01 25 4
gpt4 key购买 nike

我正在尝试使用实体管理器的合并方法在对象没有变化时更新数据库中的对象。假设该行具有以下属性:

id             DECIMAL(11) NOT NULL,
name CHAR(20) NOT NULL,
lastModified TIMESTAMP NOT NULL FOR EACH ROW ON UPDATE AS ROW CHANGE TIMESTAMP

假设我在数据库中有一个对象(我们称它为一个人),它具有以下属性:

{id: 1, name: "example", lastModified: 2019-05-22 16:24:54.771}

所以 lastModified 属性是数据库在每次行发生变化时更新的东西。

现在,当我首先获取对象,然后将人名更新为“example”(与数据库中已有的值相同),然后使用 using merge 更新它时,lastModified 属性不会似乎在数据库中更新。即

Person person = em.find(Person.class, 1)
person.setName("example")
em.merge(person)

经过以上 Action ,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 脏检查机制阅读更多相关信息。

如果你真的想在没有数据改变的情况下更新这个列,你必须在应用层完成,通过在保存 Person 对象时手动设置:

person.setLastModified(LocalDateTime.now())

关于JPA 实体管理器合并,对象中没有任何更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56258168/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com