【问题标题】:Update only the entity attributes passed from @RequestBody using Spring Rest Controller and Spring Data JPA使用 Spring Rest Controller 和 Spring Data JPA 仅更新从 @RequestBody 传递的实体属性
【发布时间】:2018-05-10 18:15:03
【问题描述】:

如何使用 Spring Rest Controller 和 Spring Data JPA 仅更新从 @RequestBody 传递的实体属性?

员工实体:

@Entity
@Table(name = "employee")
@DynamicUpdate
public class Employee {
    @Id
    @Column(name = "employee_id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer employeeId;

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

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

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

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "company_id", referencedColumnName = "company_id")
    private Company company;
}

服务类方法:

public Employee updateEmployee(Employee employee) {
    return employeeRepository.save(employee);
}

请求正文:

{
    "employeeId":4,
    "employeeName":"Paul",
    "employeeDesgn":"Lead"
}

休眠更新查询:

update employee set company_id=?, employee_desgn=?, employee_name=? where employee_id=?

Spring Data JPA 试图将 company_id 设置为 null 以进行更新,即使我没有通过 RequestBody 传递它? 但是,如果我使用employee_id 从数据库中获取实体,然后如果我尝试保存(),那么它工作正常。

我只想更新通过请求正文传递的实体属性。这种情况如何处理?

【问题讨论】:

  • 您似乎缺少您的控制器以及您如何提交您的实体

标签: hibernate spring-mvc spring-data-jpa spring-rest


【解决方案1】:

您可以通过 id 找到员工并仅填充这些值。下面是一个例子。

public Employee updateEmployee(Employee employee) {
    Employee emp = employeeRepository.findOne(employee.getEmployeeId());

    emp.setEmployeeName(employee.getEmployeeName());
    emp.setEmployeeDesgn(employee.getEmployeeDesgn());

    employeeRepository.save(emp);
}

只有员工姓名和员工设计会改变。

【讨论】:

    【解决方案2】:

    在另一个问题中,我提出了一个使用 Apache commons 的 BeanUtils 的解决方案:

    public class NullAwareBeanUtilsBean extends BeanUtilsBean {
        @Override
        public void copyProperty(Object dest, String name, Object value) throws IllegalAccessException, InvocationTargetException {
            if (value == null)
                return;
            super.copyProperty(dest, name, value);
        }
    }
    

    你可以更新你的对象:

    BeanUtilsBean notNull = new NullAwareBeanUtilsBean();
    notNull.copyProperties(destObj, origObj);
    

    这是我的original answer

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-30
      • 2017-01-18
      • 2012-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-19
      相关资源
      最近更新 更多