getReplyList() {
return replyList;
}
[/crayon]
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 를 추가했다.
[crayon]
@OneToMany(cascade={CascadeType.MERGE,CascadeType.REMOVE}, fetch=FetchType.EAGER)
@JoinColumn(name=”commentId”, nullable=false)
public List
getReplyList() {
return replyList;
}
[/crayon]
하지만 이것만으로는 안되고 TeamCommentReply 에서
[crayon]
@Column(name=”commentId”, nullable=false, insertable=false, updatable=false)
public long getCommentId() {
return commentId;
}
[/crayon]
와 같이 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 이 되는 경우가 있는듯?]]>