[Spring] could not execute statement; SQL [n/a]; constraint [null]

장선규·2023년 6월 22일
0

Spring

목록 보기
3/4

문제상황 1

org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [null]
게시글을 삭제하려고 하면 오류 발생

게시글 삭제

	// PostService.java
    @Transactional
    public void deletePost(Long postId){
        Post post = postRepository.findOne(postId);
        postRepository.delete(post);
    }

원인

Caused by: java.sql.SQLIntegrityConstraintViolationException: Cannot delete or update a parent row: a foreign key constraint fails...

DB에서 chat_roompost를 외래키(post_id)로 참조하고 있는데, 이때 게시글을 삭제하려고 하니 constraint 제약이 걸려있어 chat_room에서 삭제를 막고있다.

해결

@OneToMany 어노테이션 안에 cascade = CascadeType.ALL 속성을 추가

기존 코드

	// Post.java
    ...
    @OneToMany(mappedBy = "post")
    private List<ChatRoom> chatRooms = new ArrayList<>();

수정 후

	// Post.java
    ...
    @OneToMany(mappedBy = "post",
                cascade = CascadeType.ALL)  // 모든 경우에 CASCADE 해서 다 같이 묶여서 처리 (ALL, DELETE, UPDATE 등 있음)
    private List<ChatRoom> chatRooms = new ArrayList<>();

문제상황 2

비슷하게 이번에는 DB에서 chat_contentchat_room를 외래키(chatroom_id)로 참조하고 있는데, 이때 게시글을 삭제하려고 하니 constraint 제약이 걸려있어 chat_content에서 삭제를 막고있다.

마찬가지로 cascade = CascadeType.ALL 속성을 추가해준다.

해결

기존 코드

	// ChatRoom.java
    ...
    @OneToMany(mappedBy = "chatRoom") // ChatContent의 chatRoom에 의해 매핑됨
    private List<ChatContent> chatContents = new ArrayList<>();

수정 후

	// ChatRoom.java
    ...
    @OneToMany(mappedBy = "chatRoom", // ChatContent의 chatRoom에 의해 매핑됨
            cascade = CascadeType.ALL) // 모든 경우에 CASCADE 해서 다 같이 묶여서 처리 (ALL, DELETE, UPDATE 등 있음)
    private List<ChatContent> chatContents = new ArrayList<>();
profile
코딩연습

0개의 댓글