Luk*_*kor 14 java spring jpa spring-data spring-data-jpa
所以我查看了有关使用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;
}
}
Run Code Online (Sandbox Code Playgroud)
我们还有一个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;
}
}
Run Code Online (Sandbox Code Playgroud)
所以现在假设客户想要在webui中更改他的名字 - 然后会有一些控制器操作,其中将有更新的DTO,其中包含旧ID和新名称.
现在我必须将这个更新的DTO保存到数据库中.
目前,目前无法更新现有客户(除了删除数据库中的条目并使用新的自动生成的ID创建新的Cusomter)
然而,因为这是不可行的(特别是考虑到这样的实体可能有数百个关系) - 所以我脑子里有两个直接的解决方案:
要么
所以我的问题是,有一般规则如何做到这一点?也许我解释的两种方法的缺点是什么?
Rob*_*roj 56
甚至更好的是@Tanjim Rahman回答你可以使用Spring Data JPA使用该方法 T getOne(ID id)
Customer customerToUpdate = customerRepository.getOne(id);
customerToUpdate.setName(customerDto.getName);
customerRepository.save(customerToUpdate);
Run Code Online (Sandbox Code Playgroud)
是更好的,因为getOne(ID id) 只获取一个引用(代理)对象,而不是从数据库中获取它.在这个引用上,您可以设置您想要的内容,并在save()其上只执行您期望的SQL UPDATE语句.find()比如在@Tanjim Rahmans中调用时,回答弹簧数据JPA将执行一个SQL SELECT,以便在您刚刚更新时从数据库中物理地获取实体,这是您不需要的.
在 Spring Data 中,如果您有 ID,您只需定义一个更新查询
@Repository
public interface CustomerRepository extends JpaRepository<Customer , Long> {
@Query("update Customer c set c.name = :name WHERE c.id = :customerId")
void setCustomerName(@Param("customerId") Long id, @Param("name") String name);
}
Run Code Online (Sandbox Code Playgroud)
一些解决方案声称使用 Spring 数据并改为执行 JPA oldschool(即使以丢失更新的方式)。