[JPA] 영속성 전이와 고아객체(JPA 기본편 by 김영한)

su_y2on·2022년 1월 31일
0

JPA

목록 보기
11/17
post-thumbnail

영속성 전이와 고아객체

영속성 전이특정 엔티티와 같이 영속화, 삭제.. 가 이뤄지도록 하는 것입니다. 이는 특히 연관관계인 두 엔티티사이에서 같이 쓰면 편리합니다. 하나만 영속화 해줘도 연관관계의 엔티티도 같이 자동으로 영속화 되기때문입니다.



아래와 같이 Parent와 Child일대다 관계를 맺었다고 하고 부모쪽에서 cascade옵션을 설정해보도록 하겠습니다.

Cascade에는 많은 옵션이 있지만 지금은 PERSIST로 설정해 영속화가 함께 일어나도록 하겠습니다.

@OneToMany(mappedBy="parent", cascade=CascadeType.PERSIST)
private List<Child> childList = new ArrayList<>();

이렇게하면 부모객체를 만들어 영속화만 해줘도 함께 관계를 만들어준 자식객체도 영속화가 됩니다.




CASCADE 종류

cascade의 종류에는 ALL, PERSIST, REMOVE, MERGE, DETACH...등등이 있습니다. 이때 ALL로 하면 모든 종류가 다 적용된다고 보면 됩니다.




고아객체

고아객체는 부모엔티티와 관계가 끊어진 자식엔티티를 말합니다. 이런 고아객체를 자동으로 삭제할 수 있는 옵션이 있는데요. 바로 orphanRemoval = true 입니다.

@OneToMany(mappedBy="parent", cascade=CascadeType.PERSIST, orphanRemoval=true)
private List<Child> childList = new ArrayList<>();

parent의 children list에서 첫번째 자식을 제거하면 더이상 parent1과 그 자식엔티티는 관계를 맺지 않습니다. 따라서 해당 자식엔티티를 삭제하는 delete쿼리가 날라갑니다

Parent parent1 = em.find(Parent.class, id);
parent1.getChildren().remove(0);

cascade의 remove와의 차이점orhanRemoval관계 여부에 따라 행동한다는 것입니다. 자식엔티티가 삭제된게 아니더라도 부모와 관계가 끊어지면 지워집니다. 물론 부모엔티티가 지워져도 연결된 자식 엔티티들과 관계가 끊어지는 것이기 때문에 자식엔티티들도 삭제됩니다. 즉 orphanRemoval이 cascade remove보다 큰 개념이라고 생각하면 됩니다.



✔️주의

고아객체가 자동으로 삭제되는 기능은 자식엔티티가 해당 부모엔티티랑만 관계를 맺을 때 사용해야합니다. 그렇지 않으면 다른 관계들도 삭제가 되기때문입니다. 그리고 관계가 끊어져도 자식엔티티가 여전히 존재해야한다면 사용하면 안됩니다




영속성전이 + 고아객체

영속성전이를 ALL로 하고 orphanRemoval옵션도 켜놓으면 부모엔티티를 통해서 자식엔티티의 생명주기를 조절할 수 있게 됩니다. 따라서 부모엔티티와 자식의 생명주기를 어느정도 맞추고 싶은경우 두개를 함께 사용하면 좋습니다!

0개의 댓글