仅使用传入对象的非null属性更新实体

时间:2017-05-28 09:53:22

标签: java spring hibernate

我有一个包含多个字段的实体类型。其中一些是对其他实体的引用。我想在Spring中创建一个Rest API端点,允许用户更新这种类型的实体。

假设我有一个包含朋友列表的实体User。我只想让用户更新用户实体的某些特定字段,例如nameagedescription,而不是朋友列表。

此外,我只希望更新实体的那些属性,相应的传入值不为空。

public class UserController {
    @RequestMapping(path="",method=RequestMethod.PUT)
    public void update(@RequestBody User user) {
        userService.save(user);
    }
}

我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:1)

您可以使用DTO类来定义您需要更改的属性,而不是将User对象作为update()方法中的参数。

像这样定义一个类UpdateUserDTO

public class UpdateUserDTO {

    private String name;
    private String description;
    //other fields you want the clients to change.
    ...

}

现在,这个UpdateUserDTO可以用作更新方法中的数据传输对象。

public class UserController {

    @RequestMapping(path="",method=RequestMethod.PUT)
    public void update(@RequestBody UpdateUserDTO dto) {
        //validate your dto properties and then update your user entity. 
        userService.save(user);
    }

}

答案 1 :(得分:0)

Session session = sessionFactory.getCurrentSession();
String newuserId=newuser.getUserId();
session.clear();
User user=userService.readUser(newuserId);
Property1 prop1=user.getProperty1();
List<Property2> prop2=user.getProperty2();
session.clear();
newuser.setProp1(prop1);
newuser.setProp2(prop2);
newuser.save(); //You should go through services and abstraction layers before saving aka it should be in the DAO implementation layer.

您的问题需要改进,但请尝试这个答案。 您基本上将缺少的属性保存在某些变量中,然后将它们附加到前端User对象。 基于HQL输出,似乎这种方式获取用户并向其添加其他属性。