2014-04-25 18 views
9

Stuck on the same problem Có phương pháp nào để bỏ qua các giá trị null khi cập nhật cơ sở dữ liệu trong Hibernate không?Bỏ qua các giá trị null khi cập nhật cơ sở dữ liệu trong Hibernate

Bất cứ khi nào bạn gọi cập nhật(); của Session, nó cũng sẽ cập nhật các giá trị null được tìm thấy trong đối tượng.

Ví dụ:

User user = new User(); 
user.setUserId(5); 
user.setUserName("Maarten"); 
user.setUserFirstName(null); // but in database this value is not null 

session.update(user); 

HOẶC

session.saveOrUpdate(user); 

Các DB bây giờ sẽ cập nhật cho người dùng, nhưng sẽ thiết lập các firstname dùng null (vì nó là null trong đối tượng).

Có cách nào hay phương pháp nào trong Hibernate để tránh điều này (tôi không muốn kích hoạt truy vấn chọn/cập nhật để đặt bean)? rằng nó sẽ bỏ qua giá trị null?

+1

thể trùng lặp của [Làm thế nào tôi có thể ngăn chặn Hibernate từ cập nhật giá trị NULL] (http://stackoverflow.com/questions/7517546/how-can- i-prevent-hibernate-from-update-null-values) –

+0

vì vậy bạn muốn đặt giá trị FirstName là giá trị nó có trong DB trước đây.Bạn không muốn cập nhật rằng FirstName phải không? – Gundamaiah

+0

@Ganesh yup bạn nói đúng. – Vishrant

Trả lời

3

hibernate-dynamic-update

Thuộc tính động cập nhật cho Hibernate liệu có nên bao gồm các thuộc tính cố định ở các câu lệnh SQL UPDATE.

0

Nó phụ thuộc vào mức độ trừu tượng mà bạn muốn kiểm soát, và các quy tắc kinh doanh của đối tượng:

  • là lĩnh vực thực sự nullable, hoặc là bạn chỉ cần sử dụng nó như một DTO? có lẽ bạn cần một đối tượng trung gian để kiểm soát các giá trị rỗng
  • Điều gì xảy ra với người dùng mới (như trong ví dụ)? Tôi nên bỏ qua giá trị null, sau đó giá trị nào nên được duy trì, giá trị mặc định?

Nếu, dù sao, bạn xác định các điều kiện tiên quyết ở cấp độ thấp hơn, ví dụ: "không bao gồm giá trị null trong truy vấn cập nhật", bạn có thể sử dụng như sau:

  • chú thích cập nhật sql here. Bạn có thể sử dụng một truy vấn tùy chỉnh sql hoặc thủ tục để kiểm soát giá trị
  • dynamicUpdate là về những thay đổi, chứ không phải giá trị, vì vậy tôi nghĩ rằng nó không thực sự phù hợp
  • Sử dụng một EntityListener, và một trường thoáng phụ trợ để trở lại thay đổi nếu muốn.
  • tùy chọn khác: sử dụng một interceptor hoặc thậm chí tạo ra một custom dialect
Các vấn đề liên quan