Spring 数据 JPA : How to update a model elegantly?

标签 spring spring-mvc spring-boot spring-data 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

  3. 在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);
    }
    
  4. 如果我在mysql中有一条id为1919的记录,并且列(id、email、weblik)都有值。

    如你所见,通过 web 或 mobile 传递的用户对象有两个属性

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

    id 和 email 有值,而 weblink 没有。

    所以,如果我执行 save 方法,列 email 将更新为 xx@google.com,weblik 字段也将更新为 NULL,但是我不想更新这个字段,我只想更新email字段。

  5. 我有两种方法可以解决这个问题,但都不是优雅的。

    5.1 先加载用户对象并更新

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

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

    有没有其他方法可以更新用户模型并且不做一些额外的工作。

    提前致谢。

最佳答案

最简单的方法是适当设置 Controller 方法:

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

根据reference documentation调用此方法时会发生以下步骤:

  1. 需要获取一个User的实例。这基本上需要将 StringUserConverter 注册到 Spring MVC 中,以便将从 URI 模板中提取的路径段转换为 用户。如果你是例如使用 Spring Data 并启用其 Web 支持,如其 reference documentation 中所述,这将开箱即用。
  2. 获取现有实例后,请求数据将绑定(bind)到现有对象。
  3. 绑定(bind)的对象会被交给方法。

其他提示

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

关于 Spring 数据 JPA : How to update a model elegantly?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31768289/

相关文章:

java - Spring Controller 测试随机失败

css -/resources/style.css 未在我的 spring 应用程序的 jsp 中获取

java.lang.NoClassDefFoundError : javax/el/PropertyNotFoundException when I send invalid values to controller 错误

java - 如何实现 Multi-Tenancy Spring Boot 应用程序(每个用户都有自己的数据库)

java - org.elasticsearch.transport.NodeDisconnectedException : [][inet[localhost/127. 0.0.1:9300]][cluster/nodes/info] 断开连接

java - 使用 spring、hibernate 和 mysql 通过嵌套事务创建重复对象

java - Spring 在运行时添加外部 spring 上下文

java - 设置 Spring Boot Servlet 初始化程序时遇到问题

Spring Boot 卡住约 4 秒

java - 如何在我的 Controller Spring Boot 中获取输入表单中的值