ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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

     

    자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의

    JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., 본 강의는 자바 백엔

    www.inflearn.com

     

    반응형

    '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
Designed by Tistory.