개발자의 오르막
[#SpringBoot] CascadeType.Remove 와 orphanRemoval 의 차이 본문
[#SpringBoot] CascadeType.Remove 와 orphanRemoval 의 차이
계단 2020. 5. 28. 13:34# 상황
@OneToMany(mappedBy = "member", cascade = CascadeType.ALL, orphanRemoval = true)
private List<MemberFollow> memberFollowings = new ArrayList<>();
Member 테이블과, Member 를 팔로우하는 MemberFollow 테이블이 1:다 관계로 매핑 되어 있다.
위의 코드처럼 cascade = CascateType.All 이 걸려있는 경우, 우리는 저장할 때
memberFollowRepositroy.save(memberFollow)
위의 코드처럼 memberFollow 엔티티를 save, delete 할 필요 없이
member.getMemberFollowings().add(memberFollow);
memberRepository.save(member);
부모객체인 member 엔티티만 저장해도, memberFollow 테이블에서 데이터가 저장되고, 삭제된다.
그리고, cascateType 이 걸려있을 때, member 를 삭제 시에 자동적으로 자식인 memberFollow 데이터를 삭제한 후
member 를 삭제하기 때문에 참조 무결성 오류도 생기지 않는다.
그러나
@OneToMany(mappedBy = "member", cascade = CascadeType.ALL)
private List<MemberFollow> memberFollowings = new ArrayList<>();
위의 코드만으로는 memberFollow 테이블의 데이터가 삭제되지 않았다.
그렇다면 orPhanRemoval = true 는 어떤 역할을 하는걸 까?
CascadeType.Remove 와 orPhanRemoval = true 의 차이점은 관계가 끊어졌을 때 데이터에 대한 동작의 차이이다.
orPhanRemoval 는 부모 객체 (Member)와 자식 객체 (MemberFollow) 의 관계가 끊어졌을 때,
자식 객체의 데이터까지 삭제해주는 역할을 하고,
CascadeType.Remove 는 참조를 변경시켜 무결성 오류를 안나게 할 뿐, 그 데이터는 남겨두게 된다.
따라서 두 엔티티의 관계를 끊을 때, MemberFollow 테이블의 데이터가 계속 남아있기를 바란다면,
CascadeType.Remove 만 쓰는 것이고,
MemberFollow 테이블의 해당 데이터까지 삭제를 바란다면 orPhanRemoval = true 를 사용하는 것이다.
'SpringFrameWork > SpringBoot' 카테고리의 다른 글
스프링부트 JPA 엑셀 데이터 파싱하기 (0) | 2020.10.22 |
---|---|
[SpringBoot] 멀티모듈 프로젝트 생성 (0) | 2020.07.12 |
[#SpringBoot] Jpa 개념 정리 (0) | 2020.05.16 |
[#SpringBoot ] Lombook 어노테이션 정리 (0) | 2020.05.16 |
[Spring Boot] application.yml 설정 방법 (0) | 2020.04.02 |