본문 바로가기

개발일지

20231221 - cascade, orphanRemoval

게시물과 댓글 기능을 모두 구현하고나서 게시물을 지우려고 하면 아래와 같은 오류가 뜬다.

ava.sql.SQLIntegrityConstraintViolationException: Cannot delete or update a parent row: a foreign key constraint fails (`board`.`comment`, CONSTRAINT `FKs1slvnkuemjsq2kj4h3vhx7i1` FOREIGN KEY (`post_id`) REFERENCES `post` (`id`))

 

게시물의 Id 즉 post_id 를 Comment 테이블에서 참조하고 있으므로 해당 post_id를 가지고 있는 부모 행이 삭제되려하기 때문에 발생한 오류이다. 

 

public class Post extends Timestamp {
	
    ...

    @OneToMany(mappedBy = "post", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<Comment> commentList = new ArrayList<>();
	
    ...
}

 

cascade = CascadeType.ALL 은 모든 변경작업이 자식 엔티티에게 전파되도록 하고, orphanRemval = true 는 부모 엔티티에서 참조되지 않는 자식 엔티티를 자동으로 삭제되게 한다.

cascade 의 속성의 주요 값들로는 

cascade = CascadeType.ALL : 모든 변경 작업을 전파

cascade = CascadeType.PERSIST : 영속성 컨텍스트에 저장될 때 ( EntityManager.persist() 호출 시 )

cascade = CascadeType.MERGE : 엔티티가 병합될 때 ( EntityManager.merge() 호출 시 )

cascade = CascadeType.REMOVE : 엔티티가 삭제될 때 ( EntityManager.remove() 호출 시 )

cascade = CascadeType.REFRESH : 엔티티를 리프레시할 때 ( EntityManager.refresh() 호출 시 )

cascade = CascadeType.DETACH : 엔티티를 분리할 때 ( EntityManager.detach() 호출 시 )

 

등이 있다.