jpa에서는 같은 영속성 컨텍스트 레벨안에서 ==(instance of) 가 true가 나와야 하는 이유가 궁금합니다
201
작성한 질문수 4
(프록시 강의 26분~)
안녕하세요
영한님께서 jpa에서는 같은 영속성 컨텍스트 레벨 안에서 ==가 항상 true를 보장한다고 하셨는데,
이 부분이 잘 이해가 되지 않습니다.
em.find( = m1) 후 em.getReference( = m2)
em.find하면 영속성 컨텍스트에 실제 member가 저장되니까
em.getReference를 하면, 껍데기를 만들고, 영속성 컨텍스트에 실제 entity값을 DB에서 가져다 달라고 요청하려 하는데, 이미 1차 캐시에 entity가 존재해서 em.getReference를 해도
m1 == m2가 성립하는 것으로 이해했습니다.
em.getReference 후 em.getReference
em.getReference => 프록시 객체 반환
이때 프록시 객체를 초기화하는 과정에서 영속성 컨텍스트에 실제 entity를 저장할텐데,
다시 em.getReference를 하면 1차 캐시에 있는 entity를 사용하면 될텐데,
왜 껍데기를 만들면서 프록시를 유지하는지 궁금합니다.
em.getReference 후 em.find
em.getReference => 프록시 객체 반환
em.getReference에서 프록시를 초기화하는 과정에서 위와 같이 1차 캐시에 entity가 저장될텐데,
왜 껍데기를 만들면서 프록시를 유지하는지 궁금합니다.
위의 3가지 예제를 보니, 여러 과정들을 거쳐 결국 jpa는 같은 영속성 컨텍스트 안에서 ==가 항상 true를 보장되는지, 아니면 true를 먼저 보장하기 위해서 다른 과정들을 끼워 맞추는지 궁금합니다.
여러 과정 => 결국에 모두다 ==가 보장됨
or
모두 다 ==를 보장해야함 => ==가 true가 나오도록 끼워 맞추자.
마지막으로 jpa가 같은 영속성 컨텍스트 레벨에서 어떻게 ==를 true로 보장해주는지도 궁금합니다.
답변 1
1
안녕하세요. 이수찬님 좋은 질문입니다.
여기서 중요한 사실은 최초에 뭘로 조회했냐 입니다.
최초에 엔티티로 조회하면 em.getReference로 조회해도 엔티티가 나옵니다.
최초에 em.getReference로 프록시를 조회하면, 이후에 em.find, em.getReference로 조회해도 같은 프록시 객체 인스턴스가 조회됩니다.
이렇게 하면 일관성이 보장되겠지요?
감사합니다.
벌크연산에서 member.getAge 호출 시 영속성 컨텍스트에서 데이터를 가져오는건가요?
0
33
2
inheritance startegy 선택시 고려사항
0
24
1
Entity 동등성 비교
0
25
1
실무 조언 관련 질문입니다.
0
48
1
H2데이터베이스 파일 생성
0
60
2
서브쿼리 강의에서 ALL 예시 관련 질문드립니다.
0
57
2
수정또는 삭제시 영속성 엔티티에 값이 무조건 있어야 하나요?
0
58
1
JPQL 메소드와 락
0
56
1
Delivery @OneToOne
0
64
1
17강 4~5분대 테이블 값 조회가 안됩니다.
0
98
2
UnsupportedOperationException 발생
0
89
3
H2 Database 연결이 안됩니다.
0
98
2
연관관계 매핑 질문드립니다.
0
88
2
h2데이터베이스 실행오류
0
110
2
persistence.xml
0
112
2
양방향 연관관계에서 연관관계의 주인(mappedBy)을 왜 꼭 정해야 하나요?
0
83
1
영속성 컨텍스트
0
70
1
JPA 프록시
0
100
1
Native Query와 MyBatis
0
74
1
영속성 컨텍스트는 어떤 메모리에 저장되는건가요?
0
93
1
임베디드 타입 예시 코드 관련 질문
0
121
3
명시적 조인에서 별칭을 주면 왜 객체에 접근할 수 있나요
0
97
3
인텔리제이 패키지 커서 단축키 질문
0
109
2
혹시 현재는 ID 데이터 타입이 String이면 안되나요?
0
149
1





