티스토리 뷰

이 글은 순수 창작이 아니라, 맨 아래에 출처를 밝힌 사이트의 글 일부를 번역한 글입니다.

LazyInitializationException 은 무엇이고 어떻게 해결하는가

잦은 문제인 만큼, 다양한 조언들을 찾을 수 있는 문제이기도 하다.
하지만 맹목적으로 조언들을 들어서는 안된다. 조언대로 문제를 해결하는 과정에서 또 다른 문제가 발생하는 경우가 있기 때문이다. 그 다른 문제란 1) 성능의 이슈일수도 있고, 2) 매번 다른 결과를 도출하는 해결방법을 찾게 되는 것일 수도 있다.

다음 문단들에서, 이 예외가 무엇인지, 무시해야 하는 조언에는 어떤 것이 있는지, 그리고 조언을 듣는 것 외에 문제를 해결하기 위한 방법에는 무엇이 있는지 설명하겠다.

Hibernate 는 언제 LazyInitialization 예외를 던지는가
Hibernate 는 활성화된 세션 맥락이 없이 다른 엔티티에 lazily fetched 연관관계를 처음으로 생성해야 할 때 LazyInitializationException 예외를 던진다.

-> 즉, 엔티티를 클래스로만 만들어 놓은 후에 (세션을 시작하지 않은 상태에서) 바로 연관관계를 맺어버리면 예외가 발생한다. 아직 엔티티는 영속성 객체가 되지 않았기 때문이다.

이 상황은 대체로 클라이언트 애플리케이션이나 웹 계층 에서 생성 후 초기화되지 않은 연관관계를 사용하는 경우에 발생한다.

여기서 이 상황을 테스트하는 단순한 예제를 볼 수 있다.

EntityManager em = emf.createEntityManager(); // 엔티티 관리자를 생성한다고 생각하면 됨
em.getTransaction().begin(); // 엔티티를 관리하는 객체에서 트랜잭션을 시작한다.

TypedQuery<Author> q = em.createQuery("SELECT a FROM Author a", Author.class); // DAO 에서 SQL 쿼리를 실행하는데, Author 엔티티 타입을 반환하는 쿼리를 생성한다.
List<Author> authors = q.getResultList(); // Author 리스트를 쿼리로부터 구한다.
em.getTransaction().commit();
em.close();

for (Author author : authors) {
    List<Book> books = author.getBooks();
    log.info("... the next line will throw LazyInitializationException ..")
    books.size();
}


생성된 쿼리는 List<Book> 에 lazily feetched 연관관계를 가지고 있는 Author 엔티티를 반환한다. Hibernate 는 books 객체를 lazy loading 을 담당하는 Hibernate 만의 List 구현 방식을 사용하여 생성한다. 이 리스트 내의 원소에 접근하려 하거나 그 원소들 위에 동작하는 메서드들을 호출하려 하면, Hibernate 의 방식으로 구현된 List 는 이용 가능한 활성화된 세션이 없다는 것을 인식하고 LazyInitializationException 을 던지는 것이다.

출처

https://thorben-janssen.com/lazyinitializationexception/#When_does_Hibernate_throw_a_LazyInitializationException

 

LazyInitializationException - What it is and the best way to fix it

You can find lots of bad advice on how to fix Hibernate's LazyInitializationException. Find out which suggestions you should ignore and what to do instead.

thorben-janssen.com

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함