-
JPA > 영속성 전이와 고아객체BackEnd/JPA 2021. 4. 25. 18:37
영속성 전이
영속성 전이라는 것은 여러 관련 엔티티가 있을 때, 예를 들면 부모와 자식 엔티티에서 ,
부모가 영속성 컨텍스트에 들어갈 때 자식도 함께 관리되는 것을 말한다.
부모에 자식이 여럿 있을 때 부모와 N 개의 자식을 일일이 영속성 관리를 하기 번거로우니
cascade 옵션이라는 것을 통해 한 번에 관리해 줄 수 있다.
귀찮은 일 !
Child child1 = new Child(); Child child2 = new Child(); Parent parent = new Parent(); parent.addChild(child1); parent.addChild(child2); em.persist(parent); em.persist(child1); em.persist(child2);
CascadeType.ALL !
@Entity public class Parent { ... @OneToMany(mappedBy = "parent" , cascade = CascadeType.ALL) private List<Child> childList = new ArrayList<>(); public void addChild(Child child){ childList.add(child); child.setParent(this); } ... }
@Entity public class Child { ... @ManyToOne @JoinColumn(name="parent_id") private Parent parent; ... }
하나의 부모가 여러 자식을 관리할 때 의미있다.
예시1) 게시판 하나에서 첨부파일 여럿을 관리
예시2) Order 를 생성할 때 Delivery 정보까지 생성할 때
- 단일 엔티티에 완전히 종속적일 때는 사용해도 무방!
- 첨부 파일을 다른 엔티티에서도 관리할 때!! 는 사용이 위험하다.!!
- parent 와 child 의 라이프 싸이클이 유사할 때 사용한다.
고아객체
orphanRemoval 옵션을 부모 엔티티와 연관관계가 끊어진 자식 엔티티를 자동으로 삭제할 수 있다.
참조하는 곳이 하나일 때 사용한다. @OneToOne @OneToMany 에만 사용가능하다.
@OneToMany(mappedBy = "parent" , cascade = CascadeType.ALL, orphanRemoval = true) private List<Child> childList = new ArrayList<>();
Child child1 = new Child(); Child child2 = new Child(); Parent parent = new Parent(); parent.addChild(child1); parent.addChild(child2); em.persist(parent); em.flush(); em.clear(); Parent findParent = em.find(Parent.class, parent.getId()); findParent.getChildList().remove(0);
Hibernate: select parent0_.id as id1_7_0_, parent0_.name as name2_7_0_ from Parent parent0_ where parent0_.id=? Hibernate: select childlist0_.parent_id as parent_i3_2_0_, childlist0_.id as id1_2_0_, childlist0_.id as id1_2_1_, childlist0_.name as name2_2_1_, childlist0_.parent_id as parent_i3_2_1_ from Child childlist0_ where childlist0_.parent_id=? Hibernate: /* delete hellojpa.Child */ delete from Child where id=?
parent 를 지우면 모든 관련 자식들이 삭제되는 것은 CascadeType.Remove 처럼 동작하는 것처럼 보인다.
CascadeType.ALL + orphanRemoval=true 두 옵션을 모두 활성화하면
부모 엔티티를 통해서 자식의 생명주기를 관리할 수 있다.
도메인 주도 설계 방법론에서 엔티티(Entity)마다 리파지토리(Repository)를 만드는 경우가 많은데
이럴 때 여러 엔티티를 묶어서 하나처럼 사용하는 경우가 많다.
이러한 연관 객체의 묶음을 Aggregate라고 하고 그 안에 포함되어 있는
특정 Entity를 Aggregate Root라고 한다.
여러 엔티티를 묶어서 가져오는 경우가 많을 땐 개발에서 Aggregate Root에 해당되는
Entity에 대해서만 Repository를 만드는 경우가 많다.
CascadeType.ALL + orphanRemoval=true 를 함께 사용하는 것은 이 Aggregate Root 개념을 구현할 때 유용하다.
dao, service 는 사용하지 않고 repository 는 Aggregate Root 를 이용해서 생명주기를 관리한다.
www.inflearn.com/course/ORM-JPA-Basic/dashboard
반응형'BackEnd > JPA' 카테고리의 다른 글
JPA 경로표현식 (0) 2021.04.27 JPA > JPQL, 프로젝션 (0) 2021.04.27 JPA > 값 타입 (0) 2021.04.25 JPA > 연관관계 매핑 (0) 2021.04.18 JPA 기본 (0) 2021.04.04