본문 바로가기
I LEARNED/TIL

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

by veganwithbacon 2022. 9. 6.
반응형

@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)만 설정하여 위 요구사항을 충족

 

 

반응형

'I LEARNED > TIL' 카테고리의 다른 글

[TIL]지역변수 구분의 중요성  (0) 2022.09.11
[TIL] MultipartFile null체크  (0) 2022.09.08
WIL_실전2주차  (0) 2022.09.06
[TIL] Cascade=cascadeType.ALL 남용의 문제  (0) 2022.09.05
[TIL] Failed to instantiate StackNameProvider해결  (0) 2022.09.02

댓글