본문 바로가기
트러블슈팅

댓글 때문에 게시글이 삭제가 안될 때 (Foreign key 설정때문에)

by pyogowoon 2023. 1. 19.

문제가 생긴 Domain (Entity) 로 이동 후 

 

Board 객체 내 replys에 cascade remove 옵션을 걸어준다. (cascade = CascadeType.REMOVE)
 
문제가 발생한 이유 : 게시글을 삭제할 때 해당 게시글과 연관된 댓글을 어떻게 처리할 지 정의가 안되어 있기 때문

 

그래서 cascade 옵션을 통해 연관된 엔티티를 어떻게 처리할지 정해줘야 한다.
 
cascade는 특정 Entity의 영속성 상태가 변경되었을 때 이를 연관된 Entity에도 *전파*시킬 지 선택하는 옵션이다.
 
쉽게 말해, 연관된 Entity를 어떻게 처리할지 정해주는 것을 말한다.
cf) * cascade 옵션 종류
 
1. CascadeType.PERSIST : 엔티티를 영속화할 때 연관된 엔티티도 함께 영속화한다. 즉, Board객체를 영속성 컨텍스트에 올리면 replys객체도 영속성 컨텍스트에 올라간다.

 

2. CascadeType.REMOVE : 엔티티를 삭제하면 연관된 엔티티도 삭제한다.
 
3. CascadeType.ALL : 모든 cascade 옵션을 설정해준다. (PERSIST, REMOVE 등 옵션 모두 반영) => 위 문제에서 CascadeType.PERSIST로 설정한 뒤 댓글이 달린 게시글을 삭제해봤으나, 삭제되지 않았다.

 

 

 

@OneToMany(mappedBy="board" , fetch = FetchType.EAGER, cascade = CascadeType.REMOVE) // mappedBy = 연관관계의 주인이 아니다(난 FK가 아니에요) DB에 칼럼 만들지않음.
    // board == reply에 있는 필드 board; 임
    @JsonIgnoreProperties({"board"})  //무한참조를 방지해줌. (다이렉트로 불러올땐 효과없음)
    @OrderBy("id desc")
    private List<Reply> replys; //따로 Joincolumn이 필요없다.
    // 그 이유는 조인을 할건 아니고 어차피 따로 자바 오브젝트로만 활용할거니까

댓글