JPA에서 @OneToMany 사용하는 엔티티빈을 삭제할때

TeamComment 에는 여러개의 리플을 달 수 있는 TeamCommentReply 엔티티빈의 리스트를 가지고 있다.
이때 TeamComment의 get메소드는 아래와 같이 되어있다.

CascadeType.MERGE,CascadeType.REMOVE 를 붙인이유는 이게 없으면 리플이 삭제가 안되서…

그런데 이번에는 코멘트 자체를 삭제하려고 하니

Caused by: java.sql.BatchUpdateException: Column ‘commentId’ cannot be null
at com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:1269)
at com.mysql.jdbc.PreparedStatement.executeBatch(PreparedStatement.java:955)

와 같은 에러가 발생한다.

그래서 아래와같이 nullable=false 를 추가했다.

하지만 이것만으로는 안되고 TeamCommentReply 에서

와 같이 insertable=false, updatable=false 를 추가해야한다.

하지만, 위와 같이 하면 이번에는 댓글의 추가가 안된다..
결국 문제해결은 아래와 같이 했다.
(1) MySQL 의 테이블에서 FK 인 commentId 를 null 가능하게 할것
(2) 또한 MySQL 에서 테이블을 생성할때 ON DELETE CASCADE ALL 제약은 안붙여도 된다.
왜냐하면 @OneToMany 에 의해 JPA 에서 실행되기 때문이다.
하지만 JPA를 이용하지 않고 직접 DB를 조작할 경우도 있기 때문에 그대로 놔두자.
(3) EntityBean 의 commentId 에 nullable=true 를 할것
단, (2)번의 ON DELETE CASCADE ALL 제약이 없으면 이 부분은 필요없다.

결국은 JPA가 수동으로 레코드를 하나씩 삭제하는걸까?
ON DELETE CASCADE ALL 은 DB가 실행하는부분인데,
@OneToMany 에 의해 JPA가 실행하는것같다.
이때 일시적으로 commentId 가 null 이 되는 경우가 있는듯?

This entry was posted in Java. Bookmark the permalink.