Hibernate 설정 상세 설명 (3)
5585 단어 Hibernate
이 속성 은 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 만 조회 합 니 다.이 점 은 매우 주의해 야 한다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[JPA] 즉시로딩(EAGER)과 지연로딩(LAZY) (왜 LAZY 로딩을 써야할까?) (1)Proxy는 이 글의 주제인 즉시로딩과 지연로딩을 구현하는데 중요한 개념인데, 일단 원리는 미뤄두고 즉시로딩과 지연로딩이 무엇인지에 대해 먼저 알아보자. 눈 여겨 볼 곳은 'fetch = FetchType.EAGER...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.