因此,我看了关于使用Spring数据的JPA的各种教程,在许多情况下都有不同的做法,我不太确定正确的方法是什么。
假设存在follwing实体:
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创建一个新的Cusomter)
然而,由于这是不可行的(特别是考虑到这样一个实体可能有数百个潜在的关系)--所以我想到了2个直接的解决方案:
或
所以我的问题是,是否有一个一般的规则,如何做这件事?我解释的两种方法的缺点是什么?
比@Tanjim Rahman答案更好的是,您可以使用Spring Data JPA使用t getOne(ID ID)
方法
Customer customerToUpdate = customerRepository.getOne(id);
customerToUpdate.setName(customerDto.getName);
customerRepository.save(customerToUpdate);
它更好,因为getOne(ID ID)
只获得一个引用(代理)对象,而不从DB获取它。在这个引用上,您可以设置您想要的内容,而在save()
上,它将按照您所期望的那样执行一个SQL UPDATE语句。相比之下,当您调用find()
时,就像在@Tanjim Rahmans answer spring data中一样,JPA将执行一个SQL SELECT,以从DB中物理地提取实体,当您正在更新时,您不需要它。
问题内容: 因此,我查看了有关使用Spring Data的JPA的各种教程,并且在许多场合都做了不同的事情,而且我不确定什么是正确的方法。 假设存在以下实体: 我们还有一个DTO,该DTO在服务层中检索,然后移交给控制器/客户端。 因此,现在假设客户想要在Webui中更改其名称-然后将执行一些控制器操作,在该操作中将有具有旧ID和新名称的更新的DTO。 现在,我必须将此更新的DTO保存到数据库中。
这个问题几乎说明了一切。使用JPARepository,我如何更新一个实体? JPARepository只有一个save方法,它并不告诉我它实际上是create还是update。例如,我向数据库用户插入一个简单的对象,它有三个字段:、和: 然后我只需调用,此时它实际上是对数据库的插入: 到目前为止还不错。现在我想更新这个用户,比如说改变他的年龄。为此,我可以使用查询,无论是QueryDSL还是Na
我需要在另一个相关实体更新后对一个实体执行更新。 我有两个实体:和,关系为1:N。两者都有字段。状态取决于所有子状态字段。因此,如果更新了一个,我需要重新计算的新状态并持久化/更新它。 我实现了一个监听器: 监听器在中进行了注释,并且正在正确调用它。但是,在流程完成后,仍然保持旧状态,即使使用正确的新状态调用。
问题内容: Go中有类似Ruby的东西吗? 例如,在Ruby中,您可以编写: 输出将是: 我能找到的最接近的东西是 问题答案: 如果您的目标是避免导入第三方软件包,则另一个选择是使用json.MarshalIndent: 输出: 工作示例:http : //play.golang.org/p/SNdn7DsBjy
问题内容: 如何使用Python(而不是任何外部工具)漂亮地打印CSV文件? 例如,我有这个CSV文件: 我想将其转换为可视化的表格。例如,类似这样的内容: 问题答案: 用法: pretty.pretty_file( filename , options )** 读取CSV文件并将数据作为表格直观地打印到新文件中。 filename ,是给定的CSV文件。可选的** options 关键字参数是P
我在JSON中有一个API,我的JSON数据在我的android应用程序上是原始显示的,我希望它们以漂亮的打印格式显示,像这样 不是这样的 这是我的java代码: