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

如何在Spring Data中精美地更新JPA实体?

孔飞翔
2023-03-14
问题内容

因此,我查看了有关使用Spring Data的JPA的各种教程,并且在许多场合都做了不同的事情,而且我不确定什么是正确的方法。

假设存在以下实体:

package stackoverflowTest.dao;

import javax.persistence.*;

@Entity
@Table(name = "customers")
public class Customer {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private long id;

@Column(name = "name")
private String name;

public Customer(String name) {
    this.name = name;
}

public Customer() {
}

public long getId() {
    return id;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}
}

我们还有一个DTO,该DTO在服务层中检索,然后移交给控制器/客户端

package stackoverflowTest.dto;

public class CustomerDto {

private long id;
private String name;

public CustomerDto(long id, String name) {
    this.id = id;
    this.name = name;
}

public long getId() {
    return id;
}

public void setId(long id) {
    this.id = id;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}
}

因此,现在假设客户想要在Webui中更改其名称-然后将执行一些控制器操作,在该操作中将有具有旧ID和新名称的更新的DTO。

现在,我必须将此更新的DTO保存到数据库中。

不幸的是,当前无法更新现有客户(除了删除数据库中的条目并使用新的自动生成的ID创建新的Cusomter外)

但是,由于这是不可行的(特别是考虑到这样的实体可能具有数百个关系),因此我想到了两种简单的解决方案:

  1. 在Customer类中为ID设置一个设置器-从而允许设置ID,然后通过相应的存储库保存Customer对象。

要么

  1. 将id字段添加到构造函数中,每当您要更新客户时,总会使用旧的id创建一个新对象,但使用其他字段的新值(在这种情况下,仅是名称)

所以我的问题是,是否有一个一般规则该如何做?也许我解释的两种方法的缺点是什么?


问题答案:

甚至更好@Tanjim Rahman回答,您可以使用Spring Data JPA使用该方法 T getOne(ID id)

Customer customerToUpdate = customerRepository.getOne(id);
customerToUpdate.setName(customerDto.getName);
customerRepository.save(customerToUpdate);

更好,因为getOne(ID id)
仅使您获得引用(代理)对象,而不从数据库中获取它。在此参考上,您可以设置所需的内容,save()并且将仅执行您期望的SQL
UPDATE语句。find()相比之下,当您像@Tanjim Rahmans这样的方式调用时,Spring数据JPA将执行SQL
SELECT,以在刚更新时从DB物理上获取您不需要的实体。




 类似资料:
  • 因此,我看了关于使用Spring数据的JPA的各种教程,在许多情况下都有不同的做法,我不太确定正确的方法是什么。 假设存在follwing实体: 我们还有一个DTO,它在服务层中检索,然后交给控制器/客户端。 因此,现在假设客户想要在webui中更改他的名称--然后将会有一些控制器操作,其中将会有更新的DTO(使用旧ID和新名称)。 现在我必须将这个更新的DTO保存到数据库中。 不幸的是,目前没有

  • 问题背景 之前做springboot项目在操作数据库方面一直在使用的是Mybatis,最近在查阅资料的时候接触到了SpringData JPA与SpringData JDBC,想问一下大佬们,这三个框架如何选型

  • 我正在尝试使用Querydsl(4.1.4)查询JPA,如本文http://www.Querydsl.com/static/Querydsl/latest/reference/html/ch02.html#jpa_integration所述。我使用Hibernate(5.2.12.final)作为JPA后端。我使用和处理器从JPA注释类生成Querydsl查询类型。 这将打印: 原始JpaUpda

  • 主要内容:JPA实体更新示例JPA允许我们通过更新实体来更改数据库中的记录。 JPA实体更新示例 在这里,我们将演示如何根据主键更新学生的年龄。 完整的项目代码如下所示 - 这个例子包含以下步骤 - 第1步: 在包下创建一个名为的实体类,它包含属性:,和。 文件:StudentEntity.java 的代码如下 - 第2步: 将实体类和其他数据库配置映射到文件中。 文件:persistence.xml 的代码如下 - 在包下

  • 问题内容: 这个问题几乎说明了一切。使用JPARepository如何更新实体? JPARepository只有一个 save 方法,它不会告诉我它是否实际上是在创建或更新。例如,我插入一个简单的对象数据库的用户,其中有三个领域:,和: 然后,我简单地调用,这实际上是数据库的插入: 到目前为止,一切都很好。现在,我想更新此用户,例如更改其年龄。为此,我可以使用QueryDSL或NamedQuery