如何使用spring-data-jpa更新实体?
这个问题几乎说明了一切。使用JPARepository如何更新实体?
JPARepository只有一个
方法,它不会告诉我它是否实际上是在创建或更新。例如,我插入一个简单的对象数据库的用户,其中有三个领域:firstname
,lastname
和age
:
@Entity public class User {
private String firstname;
private String lastname;
//Setters and getters for age omitted, but they are the same as with firstname and lastname.
private int age;
@Column
public String getFirstname() {
return firstname;
}
public void setFirstname(String firstname) {
this.firstname = firstname;
}
@Column
public String getLastname() {
return lastname;
}
public void setLastname(String lastname) {
this.lastname = lastname;
}
private long userId;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
public long getUserId(){
return this.userId;
}
public void setUserId(long userId){
this.userId = userId;
}
}
然后,我简单地调用save()
,这实际上是数据库的插入:
User user1 = new User(); user1.setFirstname("john"); user1.setLastname("dew");
user1.setAge(16);
userService.saveUser(user1);// This call is actually using the JPARepository: userRepository.save(user);
到目前为止,一切都很好。现在,我想更新此用户,例如更改其年龄。为此,我可以使用QueryDSL或NamedQuery之类的查询。但是,考虑到我只想使用spring-
data-jpa和JPARepository,我如何告诉我要进行更新而不是插入?
具体来说,我如何告诉spring-data-jpa用户名和名字相同的用户实际上是EQUAL,并且现有实体应该更新?覆盖等于不能解决此问题。
回答:
实体的身份由其主键定义。由于firstname
和lastname
不是主键的一部分,因此您不能告诉JPA将User
具有相同firstname
s和lastname
s的s视为相等(如果它们具有不同的userId
s)。
因此,如果要更新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()
。
以上是 如何使用spring-data-jpa更新实体? 的全部内容, 来源链接: utcz.com/qa/419749.html