当前位置: 首页 > 知识库问答 >
问题:

使用SpringRESTController和SpringDataJPA仅更新从@RequestBody传递的实体属性

冯开诚
2023-03-14

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

员工实体:

@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"
}

Hibernate更新查询:

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

Spring Data JPA正在尝试将company_id设置为空以进行更新,即使我没有将其传递给请求体?但是如果我从数据库中得到实体,使用employee_id传递,然后如果我试图保存(),那么它的工作正常。

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

共有2个答案

章威
2023-03-14

在另一个问题中,我使用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);

这是我最初的回答

赵灼光
2023-03-14

您可以按id查找员工,并仅填充这些值。下面是一个例子。

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

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

    employeeRepository.save(emp);
}

仅更改员工姓名和员工设计。

 类似资料:
  • 问题内容: 我正在使用Spring Roo,使用Spring MVC和JPA来实现MySQL数据库的持久性。总的来说,我对Spring MVC和Java还是很陌生,但是已经使用CakePHP和Rails。 我有一个除密码外还包含个人详细信息的实体。诸如此类(不包括其他.aj文件中许多Roo生成的功能): 然后,我在控制器中执行了一个编辑操作,该操作是根据Roo自动生成的脚手架创建的以下约定: 再次

  • 问题内容: 我收到一个包含30个字段的JSON,而我的实体是根据此JSON构建的。问题是:不应更新两个字段(两个日期)。 如果使用,两个字段都会更新。 如何避免更新这两个字段? 也许使用criteria.Example? 没有我写大量的HQL,有什么方法可以做到这一点吗? 问题答案: 本文非常详细地解释了您的问题,但我也将在这里进行总结。 如果您永远不想更新这两个字段,则可以将它们标记为: 当你将

  • 我正在使用angularjs启动一个项目。我试图通过我的应用程序发送电子邮件使用Spring启动启动邮件。邮件的消息和对象是由用户以一种形式写的。我想做的是在我的RestController中使用@刚体获取消息和对象值。 我service.js中的功能 我的restContoller中的方法 @RestController公共类EmailController{ 这将引发此异常: 我怎么才能修好它?

  • 我正在使用SpringRoo,使用SpringMVC和JPA对MySQL数据库进行持久化。一般来说,我对Spring MVC和Java非常陌生,但我曾经使用过CakePHP和Rails。 我有一个实体,除了密码之外还包含个人详细信息。类似这样的东西(不包括附加. aj文件中的许多Roo生成的功能): 然后,我在我的用户控制器中有一个编辑操作,我根据Roo自动生成的脚手架创建了以下约定: 以及一个J

  • 问题内容: 这是表 用户数 和代码.. 问题答案: Ladislav的答案已更新为使用DbContext(在EF 4.1中引入):

  • 我有一个User类,它有一些附加属性: 现在,如果我调用一些方法来改变其中一个房子(例如改变它的名称属性),如果我调用,我仍然会得到房子的旧值: 我如何确保它总是更新?