Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

0gam

JPA, cascade 본문

Hibernate, JPA

JPA, cascade

byeon0gam 2016. 7. 7. 15:25





프로젝트 진행중


제공해주는 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