0gam
JPA, cascade 본문
프로젝트 진행중
제공해주는 CRUD repository.delete(list) / repository.delete(object) 가 되지 않아 의아했었다.
delete(object.idx) 를 이용해서만 삭제되어 잘 사용하고 있었지만, 항상 궁금했다.
안되는 걸 왜 만든걸까 ...
우선 잘되는 것을 사용하다, 한번에 여러개의 데이터를 삭제 해야할 상황이였는데.
반복문으로 삭제를 한개 씩 하니 삭제 속도가 굉장히 느린 것 짜증나면서 걱정이 되었다.
해서 검색을 시작했다.
뭐 여러가지 결과들을 보면서 결국 찾은 것은.
@OneToMany(mappedBy = "exhibition", cascade = { CascadeType.ALL})
CASCADE !!!! REMOVE로 삭제를 하라는 것이였다.
해서 책을 뒤져봤더니,
ALL // 모두 적용.
PERSIST // 영속
MERGE // 병합
REMOVE // 삭제
등 이 있었는다.
ALL일 때 영속성이 적용되어 있어, 삭제가 되지 않는 것이였다.
해서 계속해서 읽어보니.
생략.
Parent parent = new Parent();
child1.setParent(parent);
child2.setParent(parent);
생략.
save(parent);
//부모 저장, 연관된 자식들 저장.
부모만 영속화하면 설정한 자식들까지 영속화해서 저장한다.
해서 삭제할 때는 각각의 객체를 find 하여 각각 삭제해야한다.
하지만!
@OneToMany(mappedBy = "exhibition", cascade = { CascadeType.REMOVE })
REMOVE를 이용하면 영속성 전이 : 삭제가 가능하게 된다.
부모를 삭제하면 연관된 자식까지 삭제된다.
물론, 쿼리를 보면 자식 먼저 찾아서 삭제한 후 부모를 삭제한다.
해서 결과적으로 연관된 엔티티의 부모 엔티티에 cascade = { CascadeType.REMOVE } 설정을 해준 뒤,
delete(list) 로 삭제가 되는 것을 테스트 코드로 확인.
속도면에서도 훨씬 빠른 것을 확인하였다.
끝.
'Hibernate, JPA' 카테고리의 다른 글
JPA Cascade Types (0) | 2018.05.30 |
---|---|
fetch=FetchType.LAZY and EAGER (0) | 2016.07.08 |
javax.persistence.Transient; (0) | 2016.06.24 |