준영속 상태와 지연 로딩
- 엔티티의 생명주기
- 데이터 접근 전략 등을 설명
준영속 + 트랜잭션범위의 영속성
- 스프링이나 J2EE 컨테이너는 트랜잭션 범위 영속성 컨텍스트를 기본 전략으로 사용
- 서비스 계층에서 시작된 트랜잭션 종료시
- 영속성도 종료
- 엔티티가 서비스와 레포 계층에서 영속 상태를 유지하지만,
- 프레젠테이션 (컨트롤러 뷰 등) 에서는 준영속 상태가 됨
- 영속성도 종료
지연로딩과 준영속 상태
- 준영속 상태에서는
- 엔티티 변경감지
- 지연 로딩
- 이 동작하지 않음
- 코드
@Entity public class Order { @Id @GeneratedValue private Long id; @ManyToOne(fetch = FetchType.LAZY) // 지연 로딩 전략 private Member member; // 주문 회원 }
class OrderController { public String view(Long orderId) { Order order = orderService.findOne(orderId); Member member = order.getMember(); member.getName(); // 지연 로딩 시 예외 발생 } }
- order 객체는 이미 준영속 상태이며
- order.getMember 를 통해 지연로딩을 시도해도 값을 가져 오지 못함
- member 객체변수는 null
- member.getName() 시 NPE 가 발생한다.
위 문제 해결방안
- JPQL 의
fetch join
혹은 qdsl fetchJoin 사용
Uploaded by N2T
'자바 > JPA' 카테고리의 다른 글
[Jpa] 트랜잭션 범위와 영속성 컨텍스트 (0) | 2023.11.17 |
---|---|
[Jpa] 준영속과 지연 로딩 (0) | 2023.11.17 |
[Jpa] 파사드 계층을 추가하는 법 (0) | 2023.11.17 |
[JPA 궁금증]엔티티에서 동일성 비교의 기준은? (0) | 2023.11.15 |
[JPA 궁금증] 왜 컬렉션 타입으로 Set 을 사용하지 않고 List 를 사용하는 것인가? (0) | 2023.11.15 |