인프런 커뮤니티 질문&답변

도토리묵님의 프로필 이미지
도토리묵

작성한 질문수

자바 ORM 표준 JPA 프로그래밍 - 기본편

페치 조인 2 - 한계

IN 쿼리 작동 시점에 바인딩 로직

작성

·

115

0

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.

1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)

질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)

[질문 내용]
@BatchSize 사용시 IN 쿼리 발생 시점에 과정이 궁금해서 질문 남깁니다.

Team teamA = new Team();
teamA.setName("teamA");
Team teamB = new Team();
teamB.setName("teamB");

em.persist(teamA);
em.persist(teamB);

User user1 = new User();
user1.setUsername("user1");
user1.setTeam(teamA);
em.persist(user1);

User user2 = new User();
user2.setUsername("user2");
user2.setTeam(teamA);
em.persist(user2);

User user3 = new User();
user3.setUsername("user3");
user3.setTeam(teamB);
em.persist(user3);

em.flush();
em.clear();

List<Team> result = em.createQuery("select t from Team t", Team.class)
        .getResultList();

System.out.println("==============================");
for (Team team : result) {
    System.out.println("team.getUsers().size() = " + team.getUsers().size());
}

result에서 조회된 team들의 team_id가 IN 쿼리의 파라미터로 바인딩되고 그에 해당하는 user 인스턴스들이 영속성 컨텍스트에 저장되는 것 까지는 알겠습니다.
그 이후에 이 user 인스턴스들이 어떻게 team의 users 컬렉션에 매핑되는 것인지가 궁금합니다.

답변 1

0

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. 도토리묵님

이 부분은 하이버네이트 내부에서 수행되는데요.

result에서 조회된 team들의 team_id가 IN 쿼리의 파라미터로 바인딩되고 그에 해당하는 user 인스턴스들이 영속성 컨텍스트에 저장되고 나서, user 인스턴스에는 team_id 값이 들어있습니다. 이 값이 결국 team의 @Id 값이기 때문에 이 값을 확인하면 본인이 어떤 team에 소속되어야 하는지 알 수 있습니다.

감사합니다.

도토리묵님의 프로필 이미지
도토리묵

작성한 질문수

질문하기