흰 스타렉스에서 내가 내리지

프록시로 조회해도 영속성 컨텍스트는 영속 엔티티의 동일성을 보장한다. 본문

JPA

프록시로 조회해도 영속성 컨텍스트는 영속 엔티티의 동일성을 보장한다.

주씨. 2024. 4. 28. 01:52
728x90
Member refMember = em.getReference(Member.class, "member1");
Member findMember = em.find(Member.class, "member1");

assertTrue(refMember == findMember);   // 성공

 

먼저 em.getReference() 메소드를 사용해서 프록시로 조회했다.

그리고 다음 em.find() 를 사용해서 조회했다. 

 

refMember 는 프록시고, findMember 는 원본 엔티티이므로 둘은 서로 다른 인스턴스인가?

 

 

# 프록시로 조회해도 영속성 컨텍스트는 영속 엔티티의 동일성을 보장한다.

  • 영속성 컨텍스트는 프록시로 조회된 엔티티에 대해서 같은 엔티티를 찾는 요청이 오면 원본 엔티티가 아닌 처음 조회된 프록시를 반환한다.
  • 프록시로 처음 조회했기 때문에 이후에 em.find() 를 사용해서 같은 member1 엔티티를 찾아도 영속성 컨텍스트는 원본이 아닌 프록시를 반환한다.

 

이번에는 반대로 원본 엔티티를 먼저 조회하고 나서 프록시를 조회한다.

Member findMember = em.find(Member.class, "member1");
Member refMember = em.getReference(Member.class, "member1");

assertTrue(refMember == findMember);   // 성공
  • 원본 엔티티를 먼저 조회하면 영속성 컨텍스트는 원본 엔티티를 이미 데이터베이스에서 조회했으므로 프록시를 반환할 이유가 없다. 
  • 따라서 em.getReference() 를 호출해도 프록시가 아닌 원본을 반환한다.