250x250
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- SQL프로그래밍
- 동적sql
- JPQL
- BOJ
- 다대일
- 이진탐색
- fetch
- 즉시로딩
- 백트래킹
- exclusive lock
- FetchType
- execute
- 연결리스트
- 스프링 폼
- dfs
- CHECK OPTION
- 일대다
- 낙관적락
- 스토어드 프로시저
- 지연로딩
- PS
- querydsl
- 비관적락
- 유니크제약조건
- 다대다
- eager
- 데코레이터
- 연관관계
- shared lock
- 힙
Archives
- Today
- Total
흰 스타렉스에서 내가 내리지
프록시로 조회해도 영속성 컨텍스트는 영속 엔티티의 동일성을 보장한다. 본문
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() 를 호출해도 프록시가 아닌 원본을 반환한다.
'JPA' 카테고리의 다른 글
읽기 전용 쿼리의 성능 최적화 - @Transactional(readonly=true), setHint(readonly) (1) | 2024.04.28 |
---|---|
[JPA] N+1 문제를 피할 수 있는 다양한 방법 (1) | 2024.04.28 |
테스트 환경에서 엔티티 비교 (0) | 2024.04.28 |
[Spring-data-JPA] 벌크성 수정 쿼리 (0) | 2024.04.25 |
[JPA] Spring-data-JPA 의 메소드 이름으로 쿼리 생성 (0) | 2024.04.25 |