Có cách nào để cập nhật chỉ một số lĩnh vực của một đối tượng thực thể sử dụng phương pháp save
từ liệu mùa xuân JPA?JPA: chỉ cập nhật các lĩnh vực cụ thể
Ví dụ tôi có một thực thể JPA như thế này:
@Entity
public class User {
@Id
private Long id;
@NotNull
private String login;
@Id
private String name;
// getter/setter
// ...
}
Với repo CRUD của nó:
public interface UserRepository extends CrudRepository<User, Long> { }
Trong Spring MVC Tôi có một bộ điều khiển nhận được một đối tượng User
để cập nhật nó :
@RequestMapping(value = "/rest/user", method = RequestMethod.PUT, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public ResponseEntity<?> updateUser(@RequestBody User user) {
// Assuming that user have its id and it is already stored in the database,
// and user.login is null since I don't want to change it,
// while user.name have the new value
// I would update only its name while the login value should keep the value
// in the database
userRepository.save(user);
// ...
}
Tôi biết điều đó Tôi có thể tải người dùng bằng cách sử dụng findOne
, sau đó thay đổi tên của nó và cập nhật nó bằng cách sử dụng save
... Nhưng nếu tôi có 100 trường và tôi muốn cập nhật 50 trường, nó có thể thay đổi rất khó chịu mỗi giá trị ..
Có không có cách nào để nói một cái gì đó như "bỏ qua tất cả các giá trị null khi lưu đối tượng"?
Không có. Cách chính xác duy nhất là truy xuất đối tượng, cập nhật các trường và lưu trữ nó và điều đó có thể là động. Nếu bạn muốn một cái gì đó khác, bạn sẽ phải viết SQL cho nó và làm điều đó cho mình. Nhưng giả sử 'User' chỉ có' null' cho các trường bạn không muốn lưu những gì bạn có thể làm là theo cách khác, sử dụng 'User' và cập nhật các trường bạn biết chưa thay đổi, sau đó cập nhật cái đó. –
Có một lý do tại sao tốt hơn là không bỏ qua các giá trị null đang cập nhật một đối tượng? – Andrea
Không có cách nào đáng tin cậy để biết những gì để bỏ qua, null có thể là một lựa chọn hợp lệ cho các lĩnh vực, sau đó những gì? Bạn có lẽ có thể shoehorn một cái gì đó tại chỗ với ann 'EntityListener' hoặc một cái gì đó như thế, nhưng tôi sẽ khuyên bạn nên chống lại nó vì nó có thể sẽ dẫn đến nhiều vấn đề hơn nó giải quyết. –