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

  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

    }

  2. 我们通过http请求收集表单或移动数据,springmvc会将这些数据发送给像用户这样的Model。

例如,我有一个这样的请求:

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

  1. 在contoller中,请求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);

    }

  2. 如果我在mysql中有一个ID为1919的记录,并且列(id,email,weblik)都具有值。

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

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

ID和电子邮件具有值,而Weblink没有。

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

  1. 我有两种方法可以解决此问题,但是它们都不是很优雅。

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

    User userExist = userRepository.findOne(user.getId());

userExist.setEmail(user.getEmail());

//or using

//BeanUtil.copyProprty(formDto,modle)

userRepository.save();

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

还有其他方法可以更新用户模型,而无需执行其他任何工作。

提前致谢。

回答:

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

@RequestMapping(value = "/users/{user}", method = RequestMethod.PATCH)

public … updateUser(@ModelAttribute User user) { … }

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

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

回答:

  • 不要GET用作更新的HTTP方法。GET被定义为安全操作(无副作用),而更新则不是。PATCH是正确的方法,因为它已定义为允许对现有资源进行部分更新。
  • 要将表单数据提交到PUTPATCH请求,您需要HttpPutFormContentFilter按此处所述在应用程序中注册。我向Spring Boot提出了一个问题,默认情况下要注册它。

以上是 Spring Data JPA:如何优雅地更新模型? 的全部内容, 来源链接: utcz.com/qa/413940.html

回到顶部