hiberante FetchMode 에 대해 서
6062 단어 chmod
자바 코드
1.Criteria c = session.createCriteria(Person.class);
2.c.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
3.List<Person> list = (List<Person>)c.list();
4.for (Person p : list) {
5. System.out.println(p.getName());
6.
7. Set<Address> addressSet = p.getAddressSet();
8. for (Address a : addressSet) {
9. System.out.println(a);
10. }
11.}
1 기본적으로 FetchMode 를 설정 하지 않 음
자바 코드
1.@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
2.@JoinColumn(name = "P_ID")
3.public Set<Address> getAddressSet() {
4. return addressSet;
5.}
결과 생 성 은 다음 과 같다.
자바 코드
1.Hibernate: select this_.PERSON_ID as PERSON1_0_0_, this_.PERSON_NAME as PERSON2_0_0_
2.from PERSON this_
3.P1
4.Hibernate: select addressset0_.P_ID as P3_1_, addressset0_.ADDRESS_ID as ADDRESS1_1_, addressset0_.ADDRESS_ID as ADDRESS1_1_0_, addressset0_.ADDRESS_NAME as ADDRESS2_1_0_
5.from ADDRESS addressset0_
6.where addressset0_.P_ID=?
7.2 P1 A2
8.1 P1 A1
9.P2
10.Hibernate: select addressset0_.P_ID as P3_1_, addressset0_.ADDRESS_ID as ADDRESS1_1_, addressset0_.ADDRESS_ID as ADDRESS1_1_0_, addressset0_.ADDRESS_NAME as ADDRESS2_1_0_
11.from ADDRESS addressset0_
12.where addressset0_.P_ID=?
13.4 P2 A2
14.3 P2 A1
15.P3
16.Hibernate: select addressset0_.P_ID as P3_1_, addressset0_.ADDRESS_ID as ADDRESS1_1_, addressset0_.ADDRESS_ID as ADDRESS1_1_0_, addressset0_.ADDRESS_NAME as ADDRESS2_1_0_
17.from ADDRESS addressset0_
18.where addressset0_.P_ID=?
19.5 P3 A1
20.6 P3 A2
즉, 모든 Person 의 id 를 먼저 찾 은 다음 id 에 따라 대응 하 는 Address 를 찾 습 니 다.질문
2. FetchMode.SELECT
자바 코드
1.@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
2.@Fetch(FetchMode.SELECT)
3.@JoinColumn(name = "P_ID")
4.public Set<Address> getAddressSet() {
5. return addressSet;
6.}
효 과 는 기본 값, 즉 hibenate 의 기본 FetchMode 는 SELECT 입 니 다.
3. FetchMode.JOIN
자바 코드
1.@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
2.@Fetch(FetchMode.JOIN)
3.@JoinColumn(name = "P_ID")
4.public Set<Address> getAddressSet() {
5. return addressSet;
6.}
효 과 는 다음 과 같다.
자바 코드
1.Hibernate: select this_.PERSON_ID as PERSON1_0_1_, this_.PERSON_NAME as PERSON2_0_1_, addressset2_.P_ID as P3_3_, addressset2_.ADDRESS_ID as ADDRESS1_3_, addressset2_.ADDRESS_ID as ADDRESS1_1_0_, addressset2_.ADDRESS_NAME as ADDRESS2_1_0_
2.from PERSON this_
3. left outer join ADDRESS addressset2_
4. on this_.PERSON_ID=addressset2_.P_ID
5.
6.P1
7.2 P1 A2
8.1 P1 A1
9.P2
10.4 P2 A2
11.3 P2 A1
12.P3
13.5 P3 A1
14.6 P3 A2
외부 연결 을 사용 하여 sql 로 person 과 address 를 추출 합 니 다.
4. FetchMode.SUBSELECT
자바 코드
1.@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
2.@Fetch(FetchMode.SUBSELECT)
3.@JoinColumn(name = "P_ID")
4.public Set<Address> getAddressSet() {
5. return addressSet;
6.}
효과.
자바 코드
1.Hibernate: select this_.PERSON_ID as PERSON1_0_0_, this_.PERSON_NAME as PERSON2_0_0_
2.from PERSON this_
3.P1
4.Hibernate: select addressset0_.P_ID as P3_1_, addressset0_.ADDRESS_ID as ADDRESS1_1_, addressset0_.ADDRESS_ID as ADDRESS1_1_0_, addressset0_.ADDRESS_NAME as ADDRESS2_1_0_
5.from ADDRESS addressset0_
6.where addressset0_.P_ID in (select this_.PERSON_ID from PERSON this_)
7.2 P1 A2
8.1 P1 A1
9.P2
10.4 P2 A2
11.3 P2 A1
12.P3
13.6 P3 A2
14.5 P3 A1
2 조 sql 생 성, 2 구 는 in 으로 관련 주소 데 이 터 를 찾 습 니 다.
5. batchSize
자바 코드
1.@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
2.@BatchSize(size=4)
3.@JoinColumn(name = "P_ID")
4.public Set<Address> getAddressSet() {
5. return addressSet;
6.}
효과.
자바 코드
1.Hibernate: select this_.PERSON_ID as PERSON1_0_0_, this_.PERSON_NAME as PERSON2_0_0_
2.from PERSON this_
3.P1
4.Hibernate: select addressset0_.P_ID as P3_1_, addressset0_.ADDRESS_ID as ADDRESS1_1_, addressset0_.ADDRESS_ID as ADDRESS1_1_0_, addressset0_.ADDRESS_NAME as ADDRESS2_1_0_
5.from ADDRESS addressset0_
6.where addressset0_.P_ID in (?, ?, ?)
7.1 P1 A1
8.2 P1 A2
9.P2
10.4 P2 A2
11.3 P2 A1
12.P3
13.5 P3 A1
14.6 P3 A2
2 조 sql 생 성, 2 조 in.이 데이터베이스 에는 모두 세 개의 person 이 있다.
size = 0 또는 1 을 설정 하면 select 와 마찬가지 로 N + 1 문제 가 발생 합 니 다.
예 를 들 어 size = 2, 3 개의 sql 을 생 성 합 니 다. 첫 번 째 는 같 고 두 번 째 는...
자바 코드
1.select 。。。。
2.from ADDRESS addressset0_
3.where addressset0_.P_ID in (?, ?)
제3 조
자바 코드
1.select。。
2.from ADDRESS addressset0_
3.where addressset0_.P_ID=?
size = 3 을 설정 하면 sql 2 개 를 생 성 합 니 다. 첫 번 째 는 같 습 니 다. 첫 번 째 는?
자바 코드
1.select 。。。。
2.from ADDRESS addressset0_
3.where addressset0_.P_ID in (?, ?, ?)
위 에서 size 는 in 의 데이터 갯 수 입 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Ubuntu 아래 설치 개발 환경bin 을 다운로드 하여 jdk 를 자신의 사용자 디 렉 터 리 에 두 고 실행 가능 한 권한 을 추가 합 니 다. 이 빈 파일 을 실행 합 니 다. 2. PATH 에 자바, javac 등의 명령 을 추가 합 니 다...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.