프록시,연관관계 관리하기

프록시와 즉시로딩 주의

  • 프록시 객체 -->지연로딩

  • 가급적 지연 로딩만 사용
    --> 연관된 객체가 많을 경우에 즉시로딩을 사용하면 효율이 많이 떨어진다.

  • 즉시 로딩은 JPQL에서 N+1 문제를 일으킨다.
    --> N개의 Member가 Team을 갖고 있을 시 N개의 team조회 쿼리 발생

  • @ManyToOne , @OneToOne은 기본이 즉시 로딩 --> LAZT로 바꿔야함
    (속성fetch)

영속성 전이:CASCADE

특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함꼐 영속 상태로 만들고 싶을 때 사용한다.

ALL :영속, 삭제 모두 적용
persist : 영속만 적용

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



    Parent parent = new Parent();
            Child child1 =new Child();
            Child child2=new Child();

            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);
  • 주의할 점: 연관관계를 매핑하는 것과 아무 관련이 없음

고아 객체

  • 고아 객체 제거: 부모 엔티티와 연관관계가 끈허진 자식 엔티티를 자동으로 삭제
    orphanRemoval = true
////    @OneToMany(mappedBy = "parent",cascade = CascadeType.PERSIST,orphanRemoval = true)


 Parent parent1 = em.find(Parent.class, id);
 parent1.getChildren().remove(0);
  • 주의
    : 참조하는 곳이 하나일 때 사용해야한다.
    : @OneToOne, @OneToMany만 가능

영속성 전이 + 고아 객체, 생명주기

  • 두 옵션을 모두 활성화 하면 부모 엔티티를 통해서 자식의 생명 주기를 관리할 수 있음
  • 도메인 주도 설계의 Aggregate Root 개념을 구현할 때 유용하다.

좋은 웹페이지 즐겨찾기