【发布时间】:2012-08-06 13:32:31
【问题描述】:
这个问题几乎说明了一切。使用 JPARepository 如何更新实体?
JPARepository 只有一个 save 方法,它并没有告诉我它实际上是创建还是更新。比如我在数据库User中插入一个简单的Object,它有三个字段: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 并且应该更新现有实体?覆盖 equals 并没有解决这个问题。
【问题讨论】:
-
当您在数据库中保存现有对象时,您确定 ID 会被重写吗?我的项目中从未有过这个
-
@ByronVoorbach 是的,你是对的,刚刚测试了这个。也更新问题,谢谢
-
你好朋友,你可以看看这个链接stackoverflow.com/questions/24420572/…你可以是像saveOrUpdate()这样的方法
-
我认为我们在这里有一个很好的解决方案:enter link description here
标签: java jpa spring-data-jpa