Sự khác nhau giữa Cascade REMOVE/DELETE với orphanRemoval = true.
(Xem thêm: Hướng dẫn tự học Hibernate)
(Xem thêm: Code ví dụ Hibernate cascade, annotation @Cascade)
(Xem thêm: Code ví dụ Hibernate orphanRemoval = true)
Phân biệt Cascade với orphanRemoval.
Cascade và orphanRemoval là 2 thuộc tính trong trong các anotation @OneToOne
, @OneToMany
- Thuộc tính cascade có ý nghĩa là thực hiện 1 hành động gì đó với các object đang tham chiếu tới khi thực hiện persist, delete, merge… object hiện tại
- Thuộc tính orphanRemoval = true có ý nghĩa là khi remove object đang tham chiếu khỏi object hiện tại thì nó sẽ bị xóa khỏi database.
Ví dụ mình có quan hệ 1-n sau:
một company có thể có nhiều employee.
@Entity @Table(name = "company") public class Company { //... @OneToMany(fetch = FetchType.LAZY, mappedBy = "company", cascade = {CascadeType.REMOVE}, orphanRemoval = true) private Set<Employee> listEmployee = new HashSet<>(); }
- Với thuộc tính
cascade = {CascadeType.REMOVE}
thì khi xóa đối tượng company thì tất cả các đối tượng employee liên quan cũng bị xóa theo. (Nó chỉ tác động tới các employee khi object company bị remove) - Với thuộc tính
orphanRemoval = true
thì khi remove 1 đối tượng employee khỏilistEmployee
thì nó sẽ bị xóa khỏi database. (Nó chỉ tác động tới các employee khi listEmployee thay đổi).
Lưu ý:
- Mặc định
orphanRemoval = false
cascade = {CascadeType.ALL}
sẽ bao gồmcascade = {CascadeType.REMOVE}
- Khi muốn xóa tất cả các đối tượng Employee bên trong Company với
orphanRemoval = true
:- Ta remove tất cả các object Employee trong listEmployee bằng method clear() (
company.getListEmployee().clear();
) - Không được set null hoặc set new HashSet() (
company.setListEmployee(new HashSet<>());
orcompany.setListEmployee(null);)
- Ta remove tất cả các object Employee trong listEmployee bằng method clear() (
Okay, Done!
References:
https://stackoverflow.com/…cascade-and-orphan-removal-from-db