当前位置: 首页 > 面试题库 >

如何使用spring-data-jpa更新实体?

容阳焱
2023-03-14
问题内容

这个问题几乎说明了一切。使用JPARepository如何更新实体?

JPARepository只有一个 save
方法,它不会告诉我它是否实际上是在创建或更新。例如,我插入一个简单的对象数据库的用户,其中有三个领域:firstnamelastnameage

 @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,并且现有实体应该更新?覆盖等于不能解决此问题。


问题答案:

实体的身份由其主键定义。由于firstnamelastname不是主键的一部分,因此您不能告诉JPA将User具有相同firstnames和lastnames的s视为相等(如果它们具有不同的userIds)。

因此,如果要更新Userfirstname和标识的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将一条记录保存到我的数据库中。下面是我正在使用的方法: 我想修改这个,所以它将保存或更新。这是我目前所掌握的: 我有几个问题- #1这是不是很糟糕的做法(删除然后重新插入)? #2如果我使用hibernate实现回购,那么hibernate saveOrUpdate(..)在引擎盖下做同样的事? #3您是否知道如何使用简单的Spring数据JPA来实现这一点

  • 这个问题几乎说明了一切。使用JPARepository,我如何更新一个实体? JPARepository只有一个save方法,它并不告诉我它实际上是create还是update。例如,我向数据库用户插入一个简单的对象,它有三个字段:、和: 然后我只需调用,此时它实际上是对数据库的插入: 到目前为止还不错。现在我想更新这个用户,比如说改变他的年龄。为此,我可以使用查询,无论是QueryDSL还是Na

  • 问题内容: 因此,我查看了有关使用Spring Data的JPA的各种教程,并且在许多场合都做了不同的事情,而且我不确定什么是正确的方法。 假设存在以下实体: 我们还有一个DTO,该DTO在服务层中检索,然后移交给控制器/客户端。 因此,现在假设客户想要在Webui中更改其名称-然后将执行一些控制器操作,在该操作中将有具有旧ID和新名称的更新的DTO。 现在,我必须将此更新的DTO保存到数据库中。

  • 我已经尝试使用Spring Boot+Spring Data JPA更新实体很久了。我得到所有正确的观点回到我。我的编辑视图按ID向我返回正确的实体。一切进展顺利。直到我实际尝试保存/合并/持久化对象。每次我拿回一个有新ID的新实体。我只是不知道为什么。我看了网上的例子,还有你可能会参考的重复问题的链接。那么,在这些代码中,我在哪里犯了错误呢? 在这段代码之后。我的视图将我返回到正确的URL,但I

  • 我在Spring Boot中使用Spring Data JPA。 在使用Spring Data Jpa存储库将一个实体保存到数据库后,我不会得到整个实体。即只获取我传递给save()的值。 组织实体: 控制器类: 服务类别: