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

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 이 되는 경우가 있는듯?]]>

Related Posts