Spring Data JPA:如何优雅地更新模型?

dil*_*ent 10 spring spring-mvc spring-data spring-data-jpa spring-boot

  1. 我的模型是这样的:

    @Entity
    @Table(name = "user")
    public class User {
    
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        private Long id;
    
        @Column(name="email")
        private String email;
    
        @Column(name = "weblink")
        private String webLink;
    
        //getter & setter
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 我们通过http请求收集表单或移动数据,springmvc会将这些数据发送给像用户这样的模型.

    例如,我有这样的请求:

    http://localhost:8080/update?id=1919&email=xx@google.com

  3. 在控制器中,请求URL及其参数将自动转换为User对象.

    @RequestMapping(method = RequestMethod.GET, value = "/update0")
    public User update(@ModelAttribute("User") User user){
    
        System.out.println(user.getId());
        System.out.println(user.getEmail());
        System.out.println(user.getWebLink());
    
        return userRepository.save(test);
    }
    
    Run Code Online (Sandbox Code Playgroud)
  4. 如果我在mysql中有一个id为1919的记录,并且列(id,email,weblik)都有值.

    如您所见,通过Web或移动设备传递的用户对象具有两个属性

    http://localhost:8080/update?id=1919&email=xx@google.com

    id和电子邮件有值,而weblink没有.

    因此,如果我执行save方法,列电子邮件将更新为xx@google.com,weblik字段也将更新为NULL,但我不想更新此字段,我只想更新电子邮件字段.

  5. 我有两种方法来解决这个问题,但所有这些方法都不优雅.

    5.1首先加载用户对象并更新

    User userExist = userRepository.findOne(user.getId());
    userExist.setEmail(user.getEmail());
    
    //or using 
    //BeanUtil.copyProprty(formDto,modle)
    
    userRepository.save();
    
    Run Code Online (Sandbox Code Playgroud)

    5.2使用@DynamicUpdate,但不起作用.

    是否有其他方法来更新用户模型,不做一些额外的工作.

    提前致谢.

Oli*_*ohm 13

最简单的方法是适当设置控制器方法:

@RequestMapping(value = "/users/{user}", method = RequestMethod.PATCH)
public … updateUser(@ModelAttribute User user) { … }
Run Code Online (Sandbox Code Playgroud)

根据参考文档,当调用此方法时,会发生以下步骤:

  1. User需要获得的一个例子.这基本上需要向Spring MVC注册Converterfrom StringUser将从URI模板中提取的路径段转换为User.如果您正在使用Spring Data并按照其参考文档中的说明启用其Web支持,则此功能将开箱即用.
  2. 获得现有实例后,请求数据将绑定到现有对象.
  3. 绑定的对象将被传递给方法.

其他提示

  • 不要将GETHTTP方法用作更新.GET被定义为安全操作(没有副作用),更新不是.PATCH这是正确的方法,因为它被定义为允许对现有资源进行部分更新.
  • 要提交表单数据到PUTPATCH请求,你需要注册一个HttpPutFormContentFilter描述与应用在这里.我在Spring Boot中提出了一个问题,默认注册.