프록시 질문 있습니다
249
작성한 질문수 6
1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)
질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오) 예
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 네
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)
[질문 내용]
여기에 질문 내용을 남겨주세요.
코드1
package hellojpa;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
public class JpaMain {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
try{
Member member=new Member();
member.setUsername("hello");
em.persist(member);
em.flush();
em.clear();
Member refMember = em.getReference(Member.class, member.getId());
//refMember.getUsername();
refMember.getClass();
em.detach(refMember);
System.out.println("refMember.getUsername() = " + refMember.getUsername());
tx.commit();
} catch(Exception e){
tx.rollback();
e.printStackTrace();
}finally {
em.close();
emf.close();
}
}
}
코드2
package hellojpa;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
public class JpaMain {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
try{
Member member=new Member();
member.setUsername("hello");
em.persist(member);
em.flush();
em.clear();
Member refMember = em.getReference(Member.class, member.getId());
refMember.getUsername();
//refMember.getClass();
em.detach(refMember);
System.out.println("refMember.getUsername() = " + refMember.getUsername());
tx.commit();
} catch(Exception e){
tx.rollback();
e.printStackTrace();
}finally {
em.close();
emf.close();
}
}
}
강의에서 설명해주신대로 코드1에서는 LazyInitializationException:could not initialize proxy가 발생했습니다
하지만 제가 기존코드를 약간 변경한 코드2에서는 에러가 발생하지 않고 refMember.getUsername()=hello가 출력되었습니다.
코드2에서 에러가 발생하지 않고 출력이 되는 이유를 생각해보았고, 제가 생각한 것이 맞는 것인지 알고 싶어 질문을 남겼습니다.
코드1 은 프록시 객체가 초기화되지 않은 상태에서 detach로 준영속 상태로 바뀌었고 이후 refMember.getUsername()을 호출해도 프록시의 target이 실제 entity를 가리키지 않아서 에러가 뜬다고 이해했습니다.
코드 2는 detach되기 전 refMember.getUsername()을 통해 프록시 객체를 초기화해주어 영속 컨테이너가 관리중인 실제 entity 객체를 가리키게 해주었고, detach로 프록시 객체를 준영속 상태로 바꾸어도 프록시 객체는 실제 entity객체를 가리키고 있어 username을 찾을 수 있기 때문에 refMember.getUsername()=hello를 출력했다고 생각했습니다.
제가 생각한 것이 맞는지 궁금해서 질문드렸습니다.
리뉴얼 시기
0
27
2
변경감지(더티체킹) 이후 플러시할 경우의 쿼리
0
63
1
단일 테이블 시 null 값과 연관관계 필요성 질문
0
59
1
벌크연산에서 member.getAge 호출 시 영속성 컨텍스트에서 데이터를 가져오는건가요?
0
90
2
inheritance startegy 선택시 고려사항
0
58
1
Entity 동등성 비교
0
62
1
실무 조언 관련 질문입니다.
0
90
1
H2데이터베이스 파일 생성
0
101
2
서브쿼리 강의에서 ALL 예시 관련 질문드립니다.
1
90
2
수정또는 삭제시 영속성 엔티티에 값이 무조건 있어야 하나요?
0
82
1
JPQL 메소드와 락
0
76
1
Delivery @OneToOne
0
93
1
17강 4~5분대 테이블 값 조회가 안됩니다.
0
132
2
UnsupportedOperationException 발생
0
150
3
H2 Database 연결이 안됩니다.
0
125
2
연관관계 매핑 질문드립니다.
0
125
2
h2데이터베이스 실행오류
0
139
2
persistence.xml
0
149
2
양방향 연관관계에서 연관관계의 주인(mappedBy)을 왜 꼭 정해야 하나요?
0
116
1
영속성 컨텍스트
0
100
1
JPA 프록시
0
130
1
Native Query와 MyBatis
0
105
1
영속성 컨텍스트는 어떤 메모리에 저장되는건가요?
0
119
1
임베디드 타입 예시 코드 관련 질문
0
158
3





