실제 클래스를 상속 받아서 만들어짐
실제 클래스와 겉 모양이 같다.
사용하는 입장에서는 진짜 객체인지 프록시 객체인지 구분하지 않고 사용하면 됨(이론상)
--> 프록시는 Entity를 상속하는데 이 부분은 hibernater가 알아서해줌
프록시 객체는 실제 객체의 참조를 보관
프록시 객체를 호출하면 프록시 객체는 실제 객체의 메소드 호출
// 멤버내에 팀이 있을경우
findmember.getReference(); //프록시
findmember.getTeam(); -- > 프록시 객체를 호출하면 실제 객체의 메소드를 호출한다.
// 프록시 객체를 초기화 요청 한 경우 △
-프록시 객체는 원본 엔티티를 상속받음, 따라서 타입 체크시 주의해야한다. ( == 사용 xx - > instance of 사용하기)
Member member1 = new Member();
member1.setName("1번");
em.persist(member1);
Member member2 = new Member();
member2.setName("2번");
em.persist(member2);
em.flush();
em.clear();
Member findMember = em.find(Member.class, member1.getId());
Member refMember = em.getReference(Member.class, member2.getId());
System.out.println("findMember == refMember"+ (findMember == refMember));
Member findMember = em.find(Member.class, member1.getId());
Member refMember = em.getReference(Member.class, member1.getId());
System.out.println("member1 == > findMember.getClass==> " + findMember.getClass());
System.out.println("member1 == > refMember.getClass==> " + refMember.getClass());
//class hello.jpa.Member 둘다 클래스로나옴
//======================================================================
Member refMember = em.getReference(Member.class, member1.getId());
Member findMember = em.find(Member.class, member1.getId());
System.out.println("member1 == > findMember.getClass==> " + findMember.getClass());
System.out.println("member1 == > refMember.getClass==> " + refMember.getClass());
//class hello.jpa.Member$HibernateProxy$KuygTIr9