영속성 컨텍스트와 식별자 값
@Id
로 테이블의 기본 키와 매핑한 값)영속성 컨텍스트와 데이터베이스 저장
영속성 컨텍스트가 엔티티를 관리할 때의 장점
Map
이 하나 있는데 key
는 @Id
로 매핑한 식별자고 value
는 엔티티 인스턴스// 엔티티를 생성한 상태(비영속)
Member member = new Member();
member.setId("member1");
member.setUsername("회원1");
//엔티티를 영속
em.persist(member);
key
는 식별자 값. Member member = em.fin(Member.class, "member1");
// 첫 번째 파라미터는 엔티티 클래스 타입
// 두 번째는 조회할 엔티티의 식별자 값
em.find()
를 호출하면 먼저 1차 캐시에서 엔티티를 찾고// 다음 코드는 1차 캐시에 있는 엔티티를 조회
Member member = new Member();
member.setId("member1");
member.setUsername("회원1");
//엔티티를 영속
em.persist(member);
//1차 캐시에서 조회
Member findMember = em.find(Member.class, "member1");
em.find()
를 호출했는데 1차 캐시에 없으면Member findMember2 = em.find(Member.class, "member2");
1차 캐시에 없어 데이터베이스 조회
1. em.find(Member.class, "member2") 실행
2. member2가 1차 캐시에 없으므로 데이터베이스에서 조회
3. 조회한 데이터로 member2 엔티티를 생성, 1차 캐시에 저장(영속 상태)
4. 조회한 엔티티를 반환
5. 결과적으로 member1, member2 엔티티 인스턴스는 1차 캐시에 있다.
6. 따라서 이 엔티티들을 조회하면 메모리에 있는 1차 캐시에서 바로 불러온다. (성능상 이점이 있다)
Member a = em.find(Member.class, "member1");
Member b = em.find(Member.class, "member1");
System.out.println(a == b); // 동일성 비교
→ 1차 캐시에 있는 같은 엔티티 인스턴스를 반환하기 때문에 a == b 는 true
영속성 컨텍스트는 성능상 이점과 엔티티의 동일성을 보장