I LEARNED/TIL

[TIL] [JPA] @OnDelete VS cascade = CascadeType.REMOVE

veganwithbacon 2022. 9. 6. 12:44
반응형

@OnDelete

  • DDMS 레벨에서 작동
  • @OnDelete(action = OnDeleteAction.CASCADE)
  • DDL 생성시 cascade 제약 조건이 생성 됨.

여기서 DDL이란 Data Definition Language로 데이터 베이스를 정의하는 언어이며, CREATE, ALTER, DROP, TRUNCATE를 말한다.

 

 

casecade=CascadeType.REMOVE

  • JPA 레벨에서 작동
  • JPA가 부모 엔티티를 삭제할 때 연관된 자식 데이터에 대한 DELETE 쿼리를 실행 함

1. cascade = CascadeType.REMOVE를 설정할 경우

자식 엔티티를 삭제하는 쿼리가 먼저 실행되고, 그 다음 부모 엔티티를 삭제하는 쿼리가 실행 된다. 
그리고 자식 엔티티 한 건을 삭제 하려고 하면 부모 테이블에 연관되어 있는 데이터가 존재 하므로 아래와 같이 에러가 발생한다.
(부모와 연관된 자식이 한건이라면 이 에러가 발생하지 않는다.)
org.h2.jdbc.JdbcSQLIntegrityConstraintViolationException: Referential integrity constraint violation

cascade=cascadeType.REMOVE를 설정했는데도 원활한 삭제가 이뤄지지 않았다.

부모테이블에서 자식을 만들게 되었을 때 삭제를 진행했을 때 위와같은 에러가 지속적으로 발생해서 

cascade를 ondelete로 설정하고 에러를 해결할 수 있었다.

 

2. 둘다 설정할 경우

위와 같은 에러는 발생하지 않지만 자식 엔티티 하나만 삭제해도 부모와 관련있는 모든 자식 엔티티까지 삭제 된다.

 

 

 

결론 : @OnDelete(action= OnDeleteAction.CASCADE)만 설정하여 위 요구사항을 충족

 

 

반응형