본문 바로가기
I LEARNED/TIL

[TIL] Cascade=cascadeType.ALL 남용의 문제

by veganwithbacon 2022. 9. 5.
반응형

에러코드는 아래와 같다

org.h2.jdbc.JdbcSQLIntegrityConstraintViolationException: Referential integrity constraint violation

 

1:N의 관계를 게시물과 댓글/게시물과 이미지에 걸어놓으려고 하다보니 게시물이 삭제될시 댓글이 삭제되거나,이미지도 같이 삭제되어야 하기 때문에 cascade=cascadeType.ALL을 걸어놨다.

하지만 이 과정에서 cascade의 특성을 이해하지 않고 남발해서 문제가 발생했다.

부모의 영속화를 자식에게 전이할 이유가 없다면 cascade=cascadeType.ALL이 아닌 cascade=cascadeType.Remove를 쓰도록 하자. 만약 cascade=cascadeType.PERSIST를 사용하고 싶다면 부모를 지울 때마다 다른 쪽 부모를 DETACH해주면 된다.

 

그래서 결론이 뭔데?

연관관계를 여러 개 갖는 Entity에서는 두개 이상의 필드에 CascadeType.PERSIST를 적용하지 말 것

꼭 필요할 경우에만 cascade=cascadeType.ALL을 사용할 것

 

cascade=cascadeType.ALL 를 cascade=cascadeType.REMOVE로 바꾸면 에러가 해결된다.

반응형

댓글