인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

스프링링님의 프로필 이미지
스프링링

작성한 질문수

자바 ORM 표준 JPA 프로그래밍 - 기본편

실전 예제 4 - 상속관계 매핑

카테고리 매핑

작성

·

303

1

제가 블로그 어플리케이션을 한번 만들어 보고자 하는데

   @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "parent_id")
    private Category parent;

    @OneToMany(mappedBy = "parent", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<Category> child = new ArrayList<>();

하나의 카테고리 엔티티안에서 이런식으로 parent, child로 구성했더니 child는 parentid를 가지고 rootcategory의 경우 parentid는 null값을 가지는 하나의 테이블이 생성되었습니다. 

저장의 경우 아주 잘되는데, 다만 문제가 parent category나 root category를 삭제했을 경우 자식 카테고리들은 전부 다 삭제되도록 하고 싶습니다.

그래서 아래의 코드와 같이 연관관계를 끊어주는 메서드도 만들었습니다.

public void cutCategoryRelation(Blog blog) {
        blog.getCategories().remove(this);
        if (this.getChild().isEmpty() && this.parent != null) {
            this.parent.getChild().remove(this);
        }
        if (this.parent != null) {
            this.parent.getChild().remove(this);
        }
    }

제 생각으로는 cascade.ALL을 사용했기 때문에 부모 -> 자식으로의 연관관계만 끊어주면 된다고 생각하는데 테스트에서 에러가 발생합니다.

구글링 해보니 Parent category와 child category를 나눠서 테이블을 두개 만들어줘야 cascade가 작동된다? 라고 이해한게 맞는지 잘 모르겠습니다.

그럼 무한 카테고리를 하려면 자식을 가진 부모 카테고리는 삭제가 불가능한 것일까요? (자식없는 카테고리는 잘 삭제됩니다!)

답변 1

0

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. 스프링링님

cascade 옵션은 개인 소유에서만 사용할 수 있습니다.

관련해서 다음을 참고해주세요.

https://www.inflearn.com/questions/31969

이 경우 자식을 다른 곳에서 참조해서 사용하기 때문에 어렵습니다.

(자식을 그 자식이 참조해서 사용함)

이 경우 cascade 옵션 자체를 사용하지 않는 것을 권장합니다.

감사합니다.

스프링링님의 프로필 이미지
스프링링

작성한 질문수

질문하기