Sự khác nhau giữa Cascade REMOVE/DELETE với orphanRemoval = true

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.

Sự khác nhau giữa Cascade REMOVE/DELETE với orphanRemoval = true

@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ỏi listEmployee 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ồm cascade = {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<>()); or company.setListEmployee(null);)

 

Okay, Done!

References:

https://stackoverflow.com/…cascade-and-orphan-removal-from-db

stackjava.com