Tôi có câu hỏi liên quan đến JPA 2.0, Hibernate và "orphanRemoval".JPA 2.0/Hibernate và "orphanRemoval": Chỉ cần thay thế một thực thể sẽ không xóa mục cũ
Đầu tiên thiết lập của tôi:
- Xuân 3.0.5.RELEASE
- SprnigData JPA 1.0.1.RELEASE
- Hibernate 3.5.2 Final
- DBMS: PostgreSQL 9,0
Tôi có hai lớp thực thể khá đơn giản, "Người dùng" và "Hình đại diện", "Người dùng" có "Hình đại diện" và do đó giữa "Người dùng" và "Hình đại diện" có ionship.
Trong lớp "Thành viên", bất động sản trông như thế này:
// class "User"
@OneToOne(cascade = CascadeType.ALL, fetch=FetchType.LAZY, orphanRemoval = true)
private AvatarImage avatarImage;
Vì vậy, đó có nghĩa là, nếu "avatarImage" bất động sản được thiết lập để null, tài liệu tham khảo giữa "Thành viên" và "AvatarImage" là loại bỏ và "orphanRemoval" cơ chế sẽ xóa "avatarImage" từ cơ sở dữ liệu (xin vui lòng sửa tôi nếu tôi sai).
Vì vậy, khi tôi cập nhật "avatarImage" cho một người dùng nhất định, Tôi hiện phải viết này:
user.setAvatarImage(null); // First set it to null
userRepository.save(user); // Now "orphanRemoval" will delete the old one
user.setAvatarImage(theNewAvatarImage);
userRepository.save(user);
Vì vậy, việc thiết lập "avatarImage" bất động sản đầu tiên null, tiết kiệm "người dùng", và sau đó set the AvatarImage mới "theNewAvatarImage", một lần nữa lưu người dùng.
Đây là cách duy nhất nó hiện hoạt động cho tôi - "orphanRemoval" sẽ xóa "avatarImage" cũ trên thiết lập nó thành "null" và sau đó lưu người dùng.
Nhưng, tôi đã có thể nghĩ rằng mã này cũng nên làm việc:
user.setAvatarImage(theNewAvatarImage);
userRepository.save(user);
Vì vậy, tôi bỏ đi những thiết lập "avatarImage" thành "vô giá trị" nhưng chỉ cần thiết "theNewAvatarImage", thay thế cho "avatarImage" cũ. Nhưng điều này không hoạt động, AvatarImage cũ không bị xóa khỏi cơ sở dữ liệu khi giao dịch cam kết.
Có ai biết, tại sao mã thứ hai (chỉ thay thế hình đại diện mà không đặt nó thành "null" trước đây) không hoạt động?
Tôi thực sự đánh giá cao bất kỳ trợ giúp nào bạn có thể cung cấp
Cảm ơn rất nhiều!