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

Vil*_*nen 2 entity jpa

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

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

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

{id: 1, name: "example", lastModified: 2019-05-22 16:24:54.771}
Run Code Online (Sandbox Code Playgroud)

因此,lastModified 属性是每次行发生更改时数据库都会更新的属性。

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

Person person = em.find(Person.class, 1)
person.setName("example")
em.merge(person)
Run Code Online (Sandbox Code Playgroud)

经过上述操作后,lastModified 仍然是 2019-05-22 16:24:54.771(与之前相同)。现在如果我改变名字,即

Person person = em.find(Person.class, 1)
person.setName("new name")
em.merge(person)
Run Code Online (Sandbox Code Playgroud)

所以现在 LastModified 也会更新。

对这个有什么帮助吗?有人可以解释一下为什么当没有对对象进行更改时行不会更新吗?:) 谢谢!

Mar*_*pel 5

当您使用 时merge,Hibernate 首先在您尝试合并的元组中运行 Select 语句。执行此选择是为了获取元组的最新状态,然后使用元组中已更改的数据在数据库中运行更新。

正如您在示例中所说,您没有更改任何数据,因为您正在尝试将名称更新为与之前相同的名称,因此休眠不会对数据库运行任何更新。

您可以参考 Hibernate 脏检查机制来阅读更多相关信息。

如果您确实想在没有数据更改的情况下更新此列,则必须在应用程序层执行此操作,方法是在保存 Person 对象时手动设置:

person.setLastModified(LocalDateTime.now())