cascade = CascadeType.ALL, orphanRemoval=true 차이

DragonTiger·2023년 2월 16일
0

cascade = CascadeType.REMOVE :: 영속성전이
orphanRemoval=true :: 고아객체 삭제

ex)
부모 : Parent 자식 : Child

트랜잭션 범위안에서 실행가정


// 단순비교이기 때문에 자세한 설정은 생략합니다.

class Parent { ...//

@OneToMany(cascade = CascadeType.REMOVE)
List< Child > chilren = ...//

class Child { ...//

@ManyToOne
Parent


chilren.remove(0);  // delete 쿼리가 나가지 않는다.

//반면에 

class Parent { ...//

@OneToMany(orphanRemoval=true)
List< Child > chilren = ...//

class Child { ...//

@ManyToOne
Parent

chilren.remove(0); // delete 쿼리가 나감

//언제나가느냐 
//orphanRemoval은 부모 엔티티를 삭제했을 때 남아있는 연관관계의 해당 자식도 삭제된다.

em.remove(parent);  // parent 를 부모로 갖고있던 chilren 즉 고아가된 아이들이 
					// 2명이였다 하면 총 3개의 delete 문이 나감

결론 :: 영속성 전이 cascade = CascadeType.REMOVE 옵션은 자식객체와의 관계가 끊어지더라도 delete 쿼리가 나가지않는다.

반면에, orphanRemoval=true 옵션은 부모객체와 자식객체의 관계가 끊어지면 즉, 고아객체가 있다고 판단하면 delete 쿼리가 나간다.

profile
take the bull by the horns

0개의 댓글