JPA
578
작성한 질문수 9
Member m1= em.getReference(Member.class,member1.getId());
System.out.println("m1.getClass() = " + m1.getClass());
Member m2= em.find(Member.class,member1.getId());
System.out.println("m2.getClass() = " + m2.getClass());
System.out.println("m1==m2"+(m1.getClass() == m2.getClass()));
System.out.println(" =============== ");
1. 제가 예상한것은 영속성 컨텍스트에 프록시 객체가 담길것이고,
2. find 해서 가져오려 했으나 영속성 컨텍스트에 Member객체가 있기에 db로 안가고
프록시 객체를 그냥 가져와서 true가 나온다...
가 예상이었슴다.
근데 결과는 2번이 약간 달랐죠
일단 db로 쿼리는 select 때린다.
근데 가져온것은 프록시 객체. ㅡㅡ.... 아니 DB왜 간거지...
DB까지 간것이 맞고 그 내용까지 JPA 자기 눈으로 직접 보았으나 일단 영속성 컨텍스트에 이미 있으니 DB에서 가지고 온것을 '버리자!!!' 하고 그냥 앞의 프록시 객체를 사용을 하는건가요?
제가 이해한게 맞나여? 강사님
답변 1
4
안녕하세요. 윽이럴뚜가님^^
em.getReference는 프록시를 조회하는 것이고, em. find는 실제 데이터가 존재하는 엔티티를 찾은 기능입니다.
JPA는 같은 트랜잭션에서 영속성 컨텍스트의 동일성을 보장하기 때문에 PK가 같으면 항상 같은 인스턴스를 반환합니다. em.getReference나 em.find 둘다 같은 PK이면 같은 객체 인스턴스가 조회되어야 합니다.
그래서 둘다 같은 인스턴스가 조회된 것은 맞습니다.
그런데 여기서 em.find() 같은 경우에는 실제 데이터가 존재하는 객체를 조회해야 하는데 이미 프록시 객체로 조회가 되어버린 상황입니다. 따라서 영속성 컨텍스트의 동일성을 보장하기 위해 해당 프록시 객체를 그대로 반환하되, 내부에서 프록시를 한번 초기화 해준다고 이해하시면 됩니다.
감사합니다.^^
실무 조언 관련 질문입니다.
0
40
1
H2데이터베이스 파일 생성
0
48
2
서브쿼리 강의에서 ALL 예시 관련 질문드립니다.
0
49
2
수정또는 삭제시 영속성 엔티티에 값이 무조건 있어야 하나요?
0
46
1
JPQL 메소드와 락
0
49
1
Delivery @OneToOne
0
55
1
17강 4~5분대 테이블 값 조회가 안됩니다.
0
85
2
UnsupportedOperationException 발생
0
81
3
H2 Database 연결이 안됩니다.
0
87
2
연관관계 매핑 질문드립니다.
0
79
2
h2데이터베이스 실행오류
0
103
2
persistence.xml
0
101
2
양방향 연관관계에서 연관관계의 주인(mappedBy)을 왜 꼭 정해야 하나요?
0
76
1
영속성 컨텍스트
0
61
1
JPA 프록시
0
87
1
Native Query와 MyBatis
0
62
1
영속성 컨텍스트는 어떤 메모리에 저장되는건가요?
0
81
1
임베디드 타입 예시 코드 관련 질문
0
110
3
명시적 조인에서 별칭을 주면 왜 객체에 접근할 수 있나요
0
89
3
인텔리제이 패키지 커서 단축키 질문
0
104
2
혹시 현재는 ID 데이터 타입이 String이면 안되나요?
0
134
1
양방향 연관관계 시 연관관계 주인을 설정하는 이유
0
67
1
임베디드 타입과 MappedSuperClass의 차이점이 궁금합니다.
0
95
1
데이터베이스가 초기화되는 것 같아요
1
174
2





