[JPA] @OnDelete로 cascade 적용하기

울상냥·2023년 3월 29일
0

JPA

목록 보기
3/4

CRUD를 아무생각없이 작성하다보면 간과하는것이 생겨버린다..
바로 DELETE에서의 cascade문제!
JPA로 entity class 작성시에 참조가 있는 곳에 cascade 옵션을 주지 않으면 참조 무결성의 제약조건 때문에

Cannot delete or update a parent row (...)

와 같은 에러가 발생하고 삭제를 할 수 없다.

현재 프로젝트에서 유저(부모엔티티) 삭제 시에 관련된 데이터들을 모두 삭제 시키고 싶었기 때문에 cascade옵션을 주고자 했다


@OneToMany(cascade = CascadeType.ALL)

JPA를 사용하여 cascade 옵션을 줄 때 주로

@OneToMany(mappedBy = "parent",cascade = CascadeType.ALL)

와 같이 @OneToMany 에 cascade 옵션을 붙일 수 있다.

이 경우에는 JPA레벨에서 JPA가 부모 엔티티 삭제시 자식 데이터에 대해 DELETE쿼리를 실행한다.

하지만.. 순환참조 등 양방향 매핑을 하고 싶지 않았고

@OnDelete(action = OnDeleteAction.CASCADE)

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id")
@OnDelete(action = OnDeleteAction.CASCADE)
private User user;

@OnDelete 를 사용하여 cascade 옵션을 주었다.

이 경우에는 JPA레벨이 아닌 DDL생성시 cascade옵션이 주어져 DB에서 처리하게 된다.

not working?

@OnDelete 를 적용하여 DELETE를 실행했으나..! 여전히 참조 무결성에의한 에러가 해결되지 않았다..

properties에 ddl-autoupdate 로 설정되어있었기 때문이었고

spring.jpa.hibernate.ddl-auto=create

create 로 변경하여 테이블이 새로 create되도록 하니 정상 작동되었다..

다만 테스트 데이터가 전부 날라간다는 슬픈 사실😭
정상 작동 확인 후 update로 변경해주었다.

profile
안되면 되게하라

0개의 댓글