lazy
  • 하이버네이트는 디폴트로 lazy 로딩
  • lazy 로딩이 안되는 경우
-주키를 공유하는 1-1 연관
-컴포넌트 타입의 1-1 연관
  • Session이 닫힌 후 lazy 로딩을 시도하면 LazyInitializationException 발생
  • 컬렉션 디폴트 lazy(fetch=select) 로딩은 "n+1 select" 문제에 매우 취약
  • fetch 속성 값을 join 으로 변경하면 외부조인이 실행됨으로써 해결

fetch
  • fetch는 연관 객체를 검색하는 방법
  • fetch 속성이 영향을 미치는 범위
- get(), load() 를 통한 로딩
- 연관이 네비게이트 될 경우
- Criteria 질의
- HQL 질의(값이 select, subselect 일 경우만 영향을 미치고 join은 영향 없음)

fetch 속성의 값들
join : 외부 조인을 사용하여 연관된 객체를 검색 (lazy 속성이 true라도 외부조인으로 한방에 검색)
select(디폴트 값) : 명시적으로 lazy 로딩을 불가능하게 하지 않는 이상 연관 객체에 엑세스 하는 순간 검색
subselect : 위 select와 동일하지만 연관 객체 검색시 서브쿼리를 이용

subselect의 문제점
부모 객체 100개가 있고 각 부모마다 자식 객체를 20개씩 가지고 있을 경우
부모 객체 100개를 리스트로 가져와서 그 중 임의의 부모객체를 통해 자식 객체를 엑세스 할 때
모든 자식 객체 2000개를 한번에 로딩함
단, 부모 객체를 리스트로 가져오지 않고 특정 식별 값으로 하나만 가져올 경우 select 와 동일함

'Hibernate' 카테고리의 다른 글

HQL - 시작, from 절  (0) 2008.04.13
HQL - API  (0) 2008.04.13
늦은로딩과 조회방식  (0) 2008.04.09
동시 접근 제어  (0) 2008.03.29
openSession()과 currentSession()의 close()  (0) 2008.03.04
Session으로 작업하기  (0) 2008.03.02
Posted by 째코

댓글을 달아 주세요