Spring Data JPA:如何优雅地更新模型?
我的模型是这样的:
@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
}
我们通过http请求收集表单或移动数据,springmvc会将这些数据发送给像用户这样的Model。
例如,我有一个这样的请求:
http://localhost:8080/update?id=1919&email=xx@google.com
在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);
}
如果我在mysql中有一个ID为1919的记录,并且列(id,email,weblik)都具有值。
如您所见,通过网络或移动设备传递的用户对象具有两个属性
http://localhost:8080/update?id=1919&email=xx@google.com
ID和电子邮件具有值,而Weblink没有。
因此,如果我执行save
方法,则电子邮件列将更新为xx@google.com
,而weblik字段也将更新为NULL
,但是我不想更新此字段,我只想更新电子邮件字段。
- 我有两种方法可以解决此问题,但是它们都不是很优雅。
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) { … }
根据参考文档,当调用此方法时,将发生以下步骤:
User
需要获得一个实例。基本上,这要求Converter
从String
toUser
要在Spring MVC中注册,才能将从URI模板提取的路径段转换为User
。例如,如果您正在使用Spring Data并按照其参考文档中的说明启用其Web支持,则可以立即使用。- 获取现有实例后,请求数据将绑定到现有对象。
- 绑定的对象将被传递到方法中。
回答:
- 不要
GET
用作更新的HTTP方法。GET
被定义为安全操作(无副作用),而更新则不是。PATCH
是正确的方法,因为它已定义为允许对现有资源进行部分更新。 - 要将表单数据提交到
PUT
并PATCH
请求,您需要HttpPutFormContentFilter
按此处所述在应用程序中注册。我向Spring Boot提出了一个问题,默认情况下要注册它。
以上是 Spring Data JPA:如何优雅地更新模型? 的全部内容, 来源链接: utcz.com/qa/413940.html