所以我看了很多关于JPA与Spring Data的教程,这些教程在许多场合下都有不同的实现方式,我不太确定正确的方法是什么。
假设存在以下实体:
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,在服务层中检索并传递给控制器/客户端。
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中更改他的名称 - 那么将会有一些控制器操作,其中将更新DTO与旧ID和新名称。
现在我需要将此更新后的DTO保存到数据库中。
不幸的是,目前没有办法更新现有的客户(除非删除DB中的条目并创建一个新的带有新自动生成的ID的客户)
然而,这不可行(尤其是考虑到这样的实体可能有数百个关系),所以我脑海中有两个直接的解决方案:
- 为Customer类添加一个id setter- 允许设置id,然后通过相应的存储库保存Customer对象。
或者
- 将id字段添加到构造函数中,并且每当您想要更新客户时,始终使用旧ID创建一个新对象,但使用其他字段的新值(在本例中仅为名称)
所以我的问题是是否有一般规则如何处理这个问题?也许我解释的2种方法的缺点是什么?
save()
,并且没有覆盖它,则会出现重复ID异常。如果您已正确配置Spring事务,则每当您从数据库中获取客户并仅设置所需值时,您可能会看到一些查询记录在日志中。但是,即使没有JPA,在您的场景中通常如何使用简单的SQL更新客户行?如果您没有ID,该怎么办? - AntJavaDevstrategy = GenerationType.AUTO
,因为它是默认的。同样地,@Column(name = "id")
也可以删除,因为它与id
属性完全相同。 - belgoros