TIL

프록시와 연관 관계 관리

프록시

프록시 기초

프록시 특징

프록시 객체 초기화

Member member = em.getReference(Member.class, id1);
member.getName();

img.png

프록시의 특징

(하이버네이트는 org.hibernate.LazyInitializationException 예외를 터트림)

프록시 확인

즉시 로딩과 지연 로딩

지연 로딩 LAZY를 사용해서 프록시로 조회

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "TEAM_ID")
private Team team;

프록시와 즉시로딩 주의

N+1 문제

즉시 로딩일 때

지연 로딩 활용 - 실무

영속성 전이: CASCADE

영속성 전이: 저장

@Entity
public class Parent {

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

CASCADE의 종류

주의! – 자식의 소유자가 하나일 때만 cascade 옵션을 사용해야 한다. (부모 엔티티에게 완전히 종속적일 때(단일 소유자), 라이프 사이클이 똑같을 때) 부모 외에도 다른 엔티티가 자식과 연관관계가 있다면 쓰면 안된다. 자식이 다른 엔티티를 참조하는 건 상관 없는데, 다른 엔티티가 부모가 아님에도 자식을 참조하면 운영이 많이 힘들어진다.

고아 객체

@OneToMany(mappedBy="parent", cascade=CascadeType.ALL, orphanRemoval = true)
private List<child> childList = new ArrayList();
Parent parent1 = em.find(Parent.class, id);
parent1.getChildren().remove(0);
//자식 엔티티를 컬렉션에서 제거

고아 객체 - 주의

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