버그 모음집 😈/버그

[JPA] LazyInitializationException 오류

솔파니 2023. 12. 4. 21:16
반응형

 

발생한 오류

LazyInitializationException

 

 

오류 메시지

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.api.teamfresh.entity.Customer.keepers: could not initialize proxy - no Session

 

 

 

 

관련 코드:

VOC voc = vocService.findById(id);

 

원인: 이 오류는 Hibernate에서 엔터티의 속성이 지연 로딩(Lazy Loading)으로 설정되어 있을 때, 세션이 닫힌 후에 해당 속성에 접근하려고 할 때 발생한다. 여기서는 VOC 엔터티 내의 Customer  keepers 속성이 지연 로딩되어 있으며, 해당 속성에 접근하려 할 때 Hibernate 세션이 이미 종료되어 있어 발생하게 된다.

 

 

해결 방법:

 

1. @Transactional 사용 : Service 메소드에서 @Transactional 어노테이션을 사용하여 해당 메소드가 트랜잭션 범위 내에서 실행되게 한다. 이렇게 하면 해당 메소드 내에서 지연 로딩을 사용하여 연관된 데이터를 가져올 수 있다.

@Transactional
public VOC findById(Long id) {
return vocRepository.findById(id).orElse(null);
}

 

2. 명시적 초기화: Hibernate의 initialize 메소드를 사용하여 지연 로딩된 속성을 명시적으로 초기화할 수 있습니다. 이 방법은 지연 로딩된 객체가 실제로 필요한 경우에만 사용해야 한다.

VOC voc = vocRepository.findById(id).orElse(null);
if(voc != null) {
  Hibernate.initialize(voc.getCustomer().getKeepers());
}
반응형