본문 바로가기
  • 실행력이 모든걸 결정한다
Spring 사전 준비/JPA Hibernate

[JPA] LazyInitializationException: could not initialize proxy 해결

by 김코더 김주역 2022. 12. 28.
반응형

지연 로딩으로 설정된 필드는 실제로 사용되는 시점에 로딩되는데, 영속성 컨텍스트에서 관리되지 않는 영역에서 사용될 때는 지연 로딩을 할 수 없기 때문에 LazyInitializationException 예외가 발생하는 것이다.

즉, 트랜잭션 영역 안에서 지연 로딩이 이루어지도록 하면 이 예외는 발생하지 않을 것이다.

 

Hibernate.initialize() 메소드를 사용하면 지연 로딩으로 설정된 필드값을 강제로 로딩시킬 수 있다.

User 엔티티에 있는 progress 필드를 강제 로딩 시킨다고 해보자.

public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY) // 기본 키 생성을 데이터베이스에 위임
    private long id;

    ...

    @Column(name="progress")
    @ElementCollection(targetClass=Boolean.class)
    private List<Boolean> progress;

    ...
}

 

그럼 아래와 같이 progress 필드를 로딩할 수 있다.

@Service
@Transactional("userTransactionManager")
public class EagerService {

    @Autowired
    UserRepository userRepository;

    public User getUserWithEagerProgress(String userId) {
        User user = userRepository.findByUserId(userId).get(0);
        Hibernate.initialize(user.getProgress());
        return user;
    }
}

 

반응형

'Spring 사전 준비 > JPA Hibernate' 카테고리의 다른 글

[JPA] 2차 캐시  (0) 2022.08.30
[JPA] 트랜잭션과 Lock  (0) 2022.08.29
[JPA] 성능 최적화  (0) 2022.08.27
[JPA] JPA 예외 처리  (0) 2022.08.25
[JPA] 엔티티 그래프  (0) 2022.08.25

댓글