반응형
발생한 오류
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());
}
반응형