관리 메뉴

너와 나의 스토리

[Spring: JoinColumn/OneToMany] Caused by: org.h2.jdbc.JdbcSQLIntegrityConstraintViolationException: NULL not allowed for column "BOARD_ID"; SQL statement: 본문

개발

[Spring: JoinColumn/OneToMany] Caused by: org.h2.jdbc.JdbcSQLIntegrityConstraintViolationException: NULL not allowed for column "BOARD_ID"; SQL statement:

노는게제일좋아! 2021. 8. 9. 19:03
반응형

상황: 

  • 코드는 다음과 같다.
  • board 삭제 시, 이와 관련된 image들을 한 번에 삭제시키기 위해 orphanRemoval을 true로 설정했다.
  • 그럼에도 불구하고 board를 삭제하면 다음과 같은 에러 메시지와 함께 삭제가 진행되지 않았다.

Caused by: org.h2.jdbc.JdbcSQLIntegrityConstraintViolationException: NULL not allowed for column "BOARD_ID"; SQL statement:

  • cascade하는 과정에서 board_id가 null이 되어 생기는 문제이다. cascade 과정은 다음과 같다.
    • UPDATE: 해당 board에 포함된 image들의 board_id를 모두 null로 만든 후
    • DELETE: board_id가 null인 image들을 찾아 삭제한다
@Entity
public class BoardEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true)
    @JoinColumn(name = "board_id")
    private Set<ImageEntity> images;
    
    ...
}

 

@Entity
public class ImageEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name="board_id", nullable = false)
    private Long boardId;
    
    ...
   
}

 

해결책

  • board_id를 null로 만들려다 에러가 발생하는 것이기 때문에, board_id를 null로 바꾸지 못하게 하면 된다.
  • 다음과 같이 설정해주면 된다.
@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "board_id", insertable = false, updatable = false)
private Set<ImageEntity> images;
  • 이 설정을 통해 자식 테이블을 업데이트하지 않고 삭제할 수 있다.

 

 

참고:

- https://www.py4u.net/discuss/802683

반응형
Comments