Hibernate 설정 상세 설명 (3)

5585 단어 Hibernate
7) hibernate.max_fetch_depth:
이 속성 은 left 설정 에 사용 out join 단일 대상 조회 관계 (one - to - one / many - to - one) 에서 가장 큰 관련 깊이.기본 값 은 0 입 니 다. 즉, 기본 값 은 out - join 을 사용 하지 않 고 로드 지연 을 사용 합 니 다. 제안 하 는 값 은 0 - 3 사이 입 니 다.
max 이해fetch_depth 속성 은 one - to - one / many - to - one 요소 에 있 는 out - join 속성 을 이해 해 야 합 니 다.우 리 는 아래 의 예 로 설명 한다.
public class Department {

private Long id;

private String name;

private Employee manager;

}



public class Employee {

private Long id;

private Department dept;

}

Employee 대상 에 dept 속성 이 직원 이 속 한 부 서 를 대표 하고 Department 대상 에 manager 속성 대표 부서 의 관리자 가 있 습 니 다. 정상 적 인 맵 에 따라:
 
<class name="Department">

<id name="id">

<generator class="native" />

</id>

<property name="name" />

<many-to-one name="manager" class="Employee"/>

</class>



 <class name="Employee">

<id name="id">

<generator class="native" />

</id>

<many-to-one name="dept" column="DEPT_ID"/>

</class>

그러면 get / load 방법 을 통 해 Department 대상 을 얻 고 해당 하 는 manager 를 받 거나 Employee 대상 을 얻 고 해당 하 는 dept 를 받 으 면 hibenate 는 기본적으로 지연 로 딩 에 대응 하 는 manager / dept 를 사용 합 니 다.이것 이 바로 우리 가 말 한 것 입 니 다. 기본 적 인 상황 에서 many - to - one 에서 many 측 을 통 해 원 측 을 얻 고 로드 지연 전략 을 사용 합 니 다.그러나 로 딩 지연 을 사용 하면 추가 SELECT 가 발생 할 수 있다 는 것 을 잘 알 고 있 습 니 다. 특히 검색 할 때 N + 1 문제 가 발생 하기 쉬 우 므 로 적절 한 fetch 전략 으로 hibenate 로 딩 대상 의 방식 을 수정 할 수 있 습 니 다.저 희 는 다음 과 같이 many - to - one 의 fetch 속성 과 전략 만 토론 합 니 다 (Employee 의 dept 속성 을 예 로 들 면).
 
1, join: SQL 에서 LEFT 사용 OUT JOIN 은 many 측 과 대응 하 는 one 측 을 직접 조회 합 니 다.
 
불 러 오기 정책: 왼쪽 을 직접 사용 합 니 다. out join 은 Employee 에 대응 하 는 Department 대상 을 조회 하여 로드 지연 이 없습니다.
 
select employee0_.id as id1_1_1_, employee0_.DEPT_ID as DEPT2_1_1_, department1_.id as id1_0_0_, department1_.name as name2_0_0_, department1_.manager as manager3_0_0_ from Employee employee0_ left outer join Department department1_ on employee0_.DEPT_ID=department1_.id where employee0_.id=?

 
2, select: 두 개의 SQL 에서 각각 SELECT 를 사용 하여 many 측 과 대응 하 는 one 측 을 조회 합 니 다.
 로 딩 정책: 로 딩 지연 을 사용 하여 다른 SELECT 문 구 를 사용 하여 Employee 에 대응 하 는 Department 대상 을 조회 합 니 다.
fetch = "join" 을 사용 하면 N + 1 문 제 를 완화 하고 SQL 을 줄 일 수 있 습 니 다.이것 을 이해 하면 out - join 속성 을 이해 할 수 있 습 니 다.many - to - one 에 outer - join 속성 이 있 습 니 다. outer - join 의 수 치 는 auto, false, true 이 고 기본 값 은 auto (false 라 고 상상 할 수 있 습 니 다) 입 니 다. 즉, LEFT 를 사용 하지 않 습 니 다. OUT JOIN, true 로 설정 하면 fetch = "join" 에 해당 하 며, 하나의 SQL 에서 LEFT 를 사용 합 니 다. OUT JOIN 은 many 측 과 대응 하 는 one 측 을 직접 조회 합 니 다.물론 fetch 속성의 값 을 봐 야 합 니 다. 예 를 들 어 fetch = "select" 는 outer - join = "true" 라 도 로드 지연 을 사용 합 니 다. fetch 는 관련 대상 을 얻 는 방식 을 규정 하고 outer - join 은 LEFT 사용 여 부 를 규정 하기 때 문 입 니 다. OUT JOIN 이 관련 대상 을 가 져 오기 때문에 저 는 fetch 의 등급 이 outer - join (개인 이해 방식) 보다 높다 고 간단하게 이해 합 니 다.
outer - join 의 장점 을 이해 한 후에 문제 가 발생 했 습 니 다. 만약 에 Employee 측의 dept 가 outer - join 을 true 로 설정 하면 Employee 를 얻 었 을 때 바로 LEFT 를 사용 하 는 것 을 볼 수 있 습 니 다. OUT JOIN 이 대응 하 는 Department 대상 을 취득 하면 Department 대상 의 manager 속성 인 outer - join 도 true 로 설정 하면 Department 대상 을 받 을 때 바로 LEFT 를 사용 합 니 다. OUT JOIN 은 Employee 표 와 관련 하여 대량의 관련 대상 이 outer - join 속성 을 설정 하면 한 대상 을 얻 을 때 대량의 표 의 외부 연결 조 회 를 일 으 켜 조회 효율 도 매우 느 릴 수 있 습 니 다. 이 경우 hibenate. max 를 설정 할 수 있 습 니 다.fetch_depth 는 외부 링크 의 수량 을 제한 합 니 다.예 를 들 면:
<class name="Department">

<id name="id">

<generator class="native" />

</id>

<property name="name" />

<many-to-one name="manager" class="Employee" outer-join="true"/>

</class>



<class name="Employee">

<id name="id">

<generator class="native" />

</id>

<many-to-one name="dept" column="DEPT_ID" outer-join="true"/>

</class>

hibenate. max 가 설정 되 어 있 지 않 으 면fetch_depth, 두 개의 LEFT 를 사용 합 니 다. OUT JOIN 은 Employee, Employee 에 대응 하 는 depart. ment, depart. ment 에 대응 하 는 manager 를 모두 조회 합 니 다.
 
select employee0_.id as id1_1_2_, employee0_.DEPT_ID as DEPT2_1_2_, department1_.id as id1_0_0_, department1_.name as name2_0_0_, department1_.manager as manager3_0_0_, employee2_.id as id1_1_1_, employee2_.DEPT_ID as DEPT2_1_1_ from Employee employee0_ left outer join Department department1_ on employee0_.DEPT_ID=department1_.id left outer join Employee employee2_ on department1_.manager=employee2_.id where employee0_.id=?

 
설정 하면:
hibernate.max_fetch_depth 1
그러면 하나만 쓸 게 요. OUT JOIN 은 Employee 와 employee 가 대응 하 는 depart. ment 만 조회 합 니 다.
 
select employee0_.id as id1_1_1_, employee0_.DEPT_ID as DEPT2_1_1_, department1_.id as id1_0_0_, department1_.name as name2_0_0_, department1_.manager as manager3_0_0_ from Employee employee0_ left outer join Department department1_ on employee0_.DEPT_ID=department1_.id where employee0_.id=?

 
마찬가지 로 이 매개 변 수 는 fetch = join 의 경우 에 도 적 용 됩 니 다.
또한 조 회 를 통 해:
session.createQuery("FROM Employee").list();



session.createCriteria(Employee.class).list();

그러면 Criteria 방식 으로 조회 할 때 만 fetch 나 outer - join 이 작용 하고 Query 대상 조 회 를 사용 하면 Employee 만 조회 합 니 다.이 점 은 매우 주의해 야 한다.

좋은 웹페이지 즐겨찾기