实体的身份由其主键定义。由于
firstname和
lastname不是主键的一部分,因此您不能告诉JPA将
User具有相同
firstnames和
lastnames的s视为相等(如果它们具有不同的
userIds)。
因此,如果要更新
User由
firstname和标识的ID
lastname,则需要
User通过查询找到该ID
,然后更改找到的对象的相应字段。这些更改将在事务结束时自动刷新到数据库,因此您无需执行任何操作即可显式保存这些更改。
编辑:
也许我应该详细介绍一下JPA的整体语义。设计持久性API的主要方法有两种:
插入/更新方法 。当需要修改数据库时,应显式调用持久性API的方法:调用
insert
以插入对象或将对象的update
新状态保存到数据库。工作单元方法 。在这种情况下,您有一组由持久性库 管理 的对象。您对这些对象所做的所有更改将在工作单元结束时自动刷新到数据库中(在典型情况下,即在当前事务结束时)。当您需要向数据库中插入新记录时,可以将相应的对象设置为 Managed 。 受管 对象由其主键标识,因此,如果使用预定义的主键来 管理 对象,则该对象将与具有相同ID的数据库记录相关联,并且该对象的状态将自动传播到该记录。
JPA遵循后一种方法。
save()Spring Data JPA中的JPA由
merge()纯JPA 支持,因此,它使您的实体如上所述受到 管理
。这意味着调用
save()具有预定义ID的对象将更新相应的数据库记录,而不是插入新的数据库记录,并说明了为什么
save()不调用
create()。



