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

zzzzz님의 프로필 이미지
zzzzz

작성한 질문수

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

:단방향 연관관계 질문있습니다.

작성

·

184

0

강의 :단방향 연관관계

20분 55초에서 쿼리가 안나온다는게

create table Team (

TEAM_ID bigint not null,

TEAM_NAME varchar(255),

primary key (TEAM_ID)

)

이게 안나오느다는건가요?

근데 persist로 db에 저장되서 안나온다고 하셨는데 12분에도 persist가 있는데도 쿼리가 나오는데요. 혹시 find 앞에 persist는 예외인건가요?

try {

Team team =new Team();

team.setName("TeamA");

em.persist(team);//영속 상태가 되면 pk값이 세팅 되고 영속 상태가 됨.

Member member = new Member();

member.setUsername("member1");

// member.setTeamId(team.getId());//연관관계 매핑 배우기 전 팀의 외래키를 만들어서 멤버에 조인함.

em.persist(member);

tx.commit();

}catch (Exception e){

tx.rollback();

}finally {

em.close();//엔티티 매니저가 내부적으로 데이터베이스를 물고 동작을 함.

}

emf.close();

}

단방향 연관관계 22분에서

em.flush();

em.clear();

을 추가하면 영속성 컨테스트를 db로 보내버리고 동기화 상태에서 1차캐시가 빈상태로 조회가능하다는것은 알겠는데요.

그래서 다른점이 혹시 아래 select문인가요?

Hibernate:

select

member0_.MEMBER_ID as MEMBER_I1_0_0_,

member0_.TEAM_ID as TEAM_ID3_0_0_,

member0_.USERNAME as USERNAME2_0_0_,

team1_.TEAM_ID as TEAM_ID1_1_1_,

team1_.TEAM_NAME as TEAM_NAM2_1_1_

from

Member member0_

left outer join

Team team1_

on member0_.TEAM_ID=team1_.TEAM_ID

where

member0_.MEMBER_ID=?

답변 3

0

안녕하세요. ekek님, 공식 서포터즈 David입니다.

  1. 멤버를 조회하는 쿼리가 나오지 않습니다. DB를 조회하지 않고 영속성 컨텍스트에서 엔터티에 대한 정보를 가져오기 때문입니다. find 앞의 persist가 예외처리 되는 게 아니라 어떤 엔터티를 영속성 컨텍스트에 저장되어 있는지가 핵심입니다. 예를 들어, 영속성 컨텍스트에는 A를 저장했지만, B를 조회하는 로직이 수행된다면 DB에서 B를 조회하는 쿼리가 발생하게 됩니다.

  2. 그래서 다른점이 혹시 아래 select문인가요?

    이게 무슨 말씀인지 조금 더 상세히 풀어서 설명해 주실 수 있으실까요?

감사합니다.

0

안녕하세요.

말씀하신 강의의 20분 55초에서 발생하지 않는 쿼리는 아래와 같은 멤버를 조회하는 쿼리입니다.

select
member0_.MEMBER_ID as MEMBER_I1_0_0_,
member0_.TEAM_ID as TEAM_ID3_0_0_,
member0_.USERNAME as USERNAME2_0_0_,
team1_.TEAM_ID as TEAM_ID1_1_1_,
team1_.TEAM_NAME as TEAM_NAM2_1_1_
from Member member0_
left outer join Team team1_ on member0_.TEAM_ID=team1_.TEAM_ID
where member0_.MEMBER_ID=?

 

감사합니다.

0

안녕하세요, 인프런 AI 인턴입니다.

단방향 연관관계에 대해 질문이 있으신 건가요?

강의 내용 중 “20분 55초에서 쿼리가 안 나온다”는 부분은 영속성 컨텍스트에 객체가 영속 상태가 되어서 발생하는 현상을 설명하는 부분입니다. 여기서 언급된 ‘쿼리가 안 나오는’ 것은 객체가 처음 영속성 컨텍스트에 저장될 때 발생하는 INSERT 문이 바로 발생하지 않고, 커밋 시점에 일괄적으로 처리된다는 의미입니다.

em.persist()를 한 후에 쿼리가 바로 발생하지 않는 이유, 그리고 em.flush()em.clear()를 추가할 때 데이터베이스와 영속성 컨텍스트의 동기화가 어떻게 이루어지는지에 대한 자세한 설명이 필요하신 것 같네요.

직접적인 답변 대신, 관련된 강의 내용이나 FAQ에서 더 깊이 있는 설명을 찾으실 수 있습니다. 해당 강의의 다른 질문들을 참고하시면 도움이 될 것입니다.

강의와 관련된 자세한 질문이나 혼동되는 부분에 대해 궁금한 점이 있으시다면, 아래 링크를 통해 질문을 남겨주세요.

강의명: 자바 ORM 표준 JPA 프로그래밍 - 기본편
질문하러 가기: 양방향 연관관계와 연관관계의 주인 2 -주의점, 정리

감사합니다.

zzzzz님의 프로필 이미지
zzzzz

작성한 질문수

질문하기