Member member1 = new Member();
member1.setName("대훈");
member1.setId(1L);
em.persist(member1); // 영속 상태
Member m1 = em.find(Member.class, member1.getId()); // 데이터베이스를 통한 실제 엔티티 객체 조회
Member reference = em.getReference(Member.class, member1.getId()); // 데이터베이스 조회를 미루는 프록시 엔티티 객체 생성
Member member = em.getReference(Member.class, "id1");
member.getName();
1) getReference 메서드 호출 시, 프록시 객체를 가져온다.
2) getName 메서드 호출 시 JPA가 영속성 컨텍스트에 초기화를 요청한다.
3) 영속성 컨텍스트에서는 실제 db를 조회해서 가져온 다음 실제 Entity에 값을 넣어 생성한다. 프록시 객체는 실제 Entity를 연결해 반환한다.
4) 그 이후 getName으로 호출 시 이미 초기화 되어있는 엔티티 객체를 반환한다.
Member member1 = new Member();
member1.setName("대훈");
member1.setId(1L);
em.persist(member1);
Member m1 = em.find(Member.class, member1.getId());
System.out.println("m1 = " + m1.getClass());
Member reference = em.getReference(Member.class, member1.getId());
System.out.println("reference = " + reference.getClass());
System.out.println(m1 == reference);
m1 = class com.example.jpalearning.Member
reference = class com.example.jpalearning.Member
true
public class Member {
@Id
@Column(name = "MEMBER_ID", nullable = false)
private Long id;
@Column(name = "USERNAME")
private String name;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "TEAM_ID")
private Team team;
Team team1 = new Team();
team1.setId(1L);
team1.setName("대훈드림");
em.persist(team1);
Member member1 = new Member();
member1.setName("대훈");
member1.setTeam(team1);
member1.setId(1L);
em.persist(member1);
em.flush();
em.clear();
Member findMember = em.find(Member.class, member1.getId());
System.out.println(findMember.getTeam().getClass());
System.out.println(findMember.getTeam().getName());
select
member0_.MEMBER_ID as member_i1_0_0_,
member0_.USERNAME as username2_0_0_,
member0_.TEAM_ID as team_id3_0_0_
from
Member member0_
where
member0_.MEMBER_ID=?
Hibernate:
select
member0_.MEMBER_ID as member_i1_0_0_,
member0_.USERNAME as username2_0_0_,
member0_.TEAM_ID as team_id3_0_0_
from
Member member0_
where
member0_.MEMBER_ID=?
class com.example.jpalearning.Team$HibernateProxy$3r73QETY
select
team0_.TEAM_ID as team_id1_1_0_,
team0_.USERNAME as username2_1_0_
from
Team team0_
where
team0_.TEAM_ID=?
Hibernate:
select
team0_.TEAM_ID as team_id1_1_0_,
team0_.USERNAME as username2_1_0_
from
Team team0_
where
team0_.TEAM_ID=?
대훈드림
public class Member {
@Id
@Column(name = "MEMBER_ID", nullable = false)
private Long id;
@Column(name = "USERNAME")
private String name;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "TEAM_ID")
private Team team;
Team team1 = new Team();
team1.setId(1L);
team1.setName("대훈드림");
em.persist(team1);
Member member1 = new Member();
member1.setName("대훈");
member1.setTeam(team1);
member1.setId(1L);
em.persist(member1);
em.flush();
em.clear();
Member findMember = em.find(Member.class, member1.getId());
System.out.println(findMember.getTeam().getClass());
System.out.println(findMember.getTeam().getName());
select
member0_.MEMBER_ID as member_i1_0_0_,
member0_.USERNAME as username2_0_0_,
member0_.TEAM_ID as team_id3_0_0_,
team1_.TEAM_ID as team_id1_1_1_,
team1_.USERNAME as username2_1_1_
from
Member member0_
left outer join
Team team1_
on member0_.TEAM_ID=team1_.TEAM_ID
where
member0_.MEMBER_ID=?
Hibernate:
select
member0_.MEMBER_ID as member_i1_0_0_,
member0_.USERNAME as username2_0_0_,
member0_.TEAM_ID as team_id3_0_0_,
team1_.TEAM_ID as team_id1_1_1_,
team1_.USERNAME as username2_1_1_
from
Member member0_
left outer join
Team team1_
on member0_.TEAM_ID=team1_.TEAM_ID
where
member0_.MEMBER_ID=?
class com.example.jpalearning.Team
대훈드림
Team team1 = new Team();
team1.setName("teamA");
em.persist(team1);
Team team2 = new Team();
team2.setName("teamB");
em.persist(team2);
Member member1 = new Member();
member1.setTeam(team1);
member1.setName("dh");
em.persist(member1);
Member member2 = new Member();
member2.setTeam(team2);
member2.setName("dh2");
em.persist(member2);
em.flush();
em.clear();
List<Member> members = em
.createQuery("select m from Member m", Member.class)
.getResultList();
----------- Member 객체 호출 ------------
/* select
m
from
Member m */ select
member0_.MEMBER_ID as member_i1_0_,
member0_.USERNAME as username2_0_,
member0_.TEAM_ID as team_id3_0_
from
Member member0_
Hibernate:
/* select
m
from
Member m */ select
member0_.MEMBER_ID as member_i1_0_,
member0_.USERNAME as username2_0_,
member0_.TEAM_ID as team_id3_0_
from
Member member0_
select
team0_.TEAM_ID as team_id1_1_0_,
team0_.USERNAME as username2_1_0_
from
Team team0_
where
team0_.TEAM_ID=?
----------- Team 객체 호출 SQL을 Member 테이블의 Row 갯수만큼 쿼리를 날린다. ------------
Hibernate:
select
team0_.TEAM_ID as team_id1_1_0_,
team0_.USERNAME as username2_1_0_
from
Team team0_
where
team0_.TEAM_ID=?
select
team0_.TEAM_ID as team_id1_1_0_,
team0_.USERNAME as username2_1_0_
from
Team team0_
where
team0_.TEAM_ID=?
Hibernate:
select
team0_.TEAM_ID as team_id1_1_0_,
team0_.USERNAME as username2_1_0_
from
Team team0_
where
team0_.TEAM_ID=?