멤버를 조회할 때 팀도 함께 조회해야될까? 에서 시작하는 이야기

 

 

지연로딩

 

프록시 기초

- getFind()말고 getReference()가 있다.

- 데이터 조회를 미루는 가짜 엔티티 객체 조회한다. 

- 프록시가 영속성 컨텍스트를 통해 DB조회 -> 엔티티 생성해서 그 때 값을 조회한다.

 

프록시 특징

- 처음 한번만 초기화

- 프록시 객체가 실제 엔티티로 바뀌는 것이 아님. 

- 비교할 때 instanceof 사용해야 함.

- 이미 영속성 컨텍스트에 엔티티가 있으면 getReference() 를 호출해도 실제 엔티티 반환.

- 중요한건 뭐냐 , 프록시이건 아니건 잘 돌아가도록 해야 함.

 

프록시 인스턴스의 초기화 여부 확인

PersistenceUnitUtil.isLoaded(Object entity) 

 

프록시 클래스 확인 방법

entity.getClass().getName() 출력(..javasist.. or HibernateProxy…) 

 

프록시 강제 초기화

org.hibernate.Hibernate.initialize(entity); 

 


즉시 로딩과 지연로딩

 

즉시 로딩
ManyToOne(fetch = FetchType.EAGER)

 

지연 로딩

ManyToOne(fetch = FetchType.LAZY)

 

 

모든 연관관계에 지연로딩을 써라.

왜 ?

    - 즉시로딩을 하면 예상하지 못한 SQL 날라감.

    - JPQL에서 N+1문제 발생.

    - @ManyToOne, @OneToOne은 기본이 즉시 로딩이라 지연 로딩 설정 필요함.

 

 

 


 

영속성 전이 : CASCADE

- 특정 엔티티를 영속상태로 만들면서 연관 엔티티도 영속상태로 만들고 싶을 때 씀.

 

ALL: 모두 적용

PERSIST: 영속

REMOVE: 삭제

MERGE: 병합

REFRESH: REFRESH

DETACH: DETACH 

 

고아객체 

- 고아 객체 제거: 부모 엔티티와 연관관계가 끊어진 자식 엔티티 를 자동으로 삭제

orphanRemoval = true 

 

 

영속성 전이 + 고아객체

CascadeType.ALL + orphanRemoval=true 

- 자식 생명주기를 부모가 관리하도록 할 수 있다.

- DDD 에 Aggregate Root 개념을 구현할 때 유용함.

 

 


 

 

 

+ Recent posts