【问题标题】:Springboot Jpa - How to update entity to mysql databaseSpring Boot Jpa - 如何将实体更新到 mysql 数据库
【发布时间】:2019-07-17 11:48:29
【问题描述】:

我想更新 Employee 实体,但它不起作用,它只是将实体添加到表中而不是更新它。

控制者

@PutMapping("updateEmployee/{id}")
public void updateEmployee(@PathVariable long id, @RequestBody Employee employee) {
        employeeService.updateEmployee(id, employee);
}

连接到 JpaRepository 的服务

public void updateEmployee(long id, Employee employee) {
        employeeRepository.save(employee);
}

【问题讨论】:

  • 更新实体时,您的Employee model id(您将要保存的)应该与表格中的primary key id 相同

标签: mysql spring-boot spring-data-jpa


【解决方案1】:

在 Spring Data JPA(使用 Hibernate)中更新实体的常见做法是:

  1. 读取实体,
  2. 更新其属性,
  3. 关闭交易。

例如:

@Service
public class EmployeeService {

    @Autowired private EmployeeRepo repo;

    @Transactional
    public Optional<Employee> update(long employeeId, Employee source) {
         return repo.findById(employeeId).map(target -> {
             target.setName(source.getName());
             // update other props...
             return target; 
         });
    }  
}

所以当一个事务关闭时,Hibernate 会自动更新数据库中的实体——save 方法调用是不必要的。

【讨论】:

    【解决方案2】:

    save()之前设置正在更新详细信息的员工ID。在这里,您没有指定要在其上更新数据的主键,从而产生新记录。

    public void updateEmployee(long id, Employee employee) {
            employee.setId(id);
            employeeRepository.save(employee);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-04
      • 1970-01-01
      • 1970-01-01
      • 2019-05-08
      • 2020-07-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多