My Model is like this:
@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
}
we collect form or mobile data via http request, and springmvc will make these data to a Model like user.
for example, I have a request like this:
http://localhost:8080/update?id=1919&[email protected]
in contoller, the request url and its paramters will be automaticlly trans to a User
object.
@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);
}
if I have a record in mysql which id is 1919, and the columns (id, email, weblik) are all have values.
as you see, the user object which passed by web or mobile have two properties
http://localhost:8080/update?id=1919&[email protected]
id and email have values and weblink do not have.
So, if i execute save
method, the columns email will be updated to [email protected]
, and the weblik field will also be updated to NULL
, but I don't want to update this field, I just want to update email field.
I have two ways to fix the problem, but all of them are not elegant.
5.1 load user object first and update
User userExist = userRepository.findOne(user.getId());
userExist.setEmail(user.getEmail());
//or using
//BeanUtil.copyProprty(formDto,modle)
userRepository.save();
5.2 using @DynamicUpdate
, but its not working.
Is there other way to update the User Model and do not do some extra work.
Thanks in advance.
JPA and Hibernate provide different methods to persist new and to update existing entities. You can choose between JPA's persist and merge and Hibernate's save and update methods.
Entities are typically modified with Hibernate by retrieving them from the database, changing specific fields, and persisting the entities. You can modify or update the entities by defining the repository method using @Query and @Modifying annotations.
The easiest way is an appropriately set up controller method:
@RequestMapping(value = "/users/{user}", method = RequestMethod.PATCH)
public … updateUser(@ModelAttribute User user) { … }
According to the reference documentation when this method is called the following steps happen:
User
needs to be obtained. This basically requires a Converter
from String
to User
to be registered with Spring MVC to convert the path segment extracted from the URI template into a User
. If you're e.g. using Spring Data and enable its web support as described in its reference documentation, this will work out of the box.GET
as HTTP method for updates. GET
is defined to be a safe operation (no side effects), which an update is not. PATCH
is the correct method here as it's defined to allow partial updates to an existing resource.PUT
and PATCH
requests, you need to register an HttpPutFormContentFilter
with the application as described here. I filed an issue with Spring Boot to register that by default.If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With