@Entity
@Setter
@Getter
public class Question {
(생략)
@OneToMany(mappedBy = "question", cascade = CascadeType.REMOVE)
private List<Answer> answerList;
}
@Test
void Jpa_Question_Answer() {
Optional<Question> oq = this.questionRepository.findById(2);
assertTrue(oq.isPresent());
Question question = oq.get();
List<Answer> answerList = question.getAnswerList();
assertEquals(1, answerList.size());
assertEquals("네 자동으로 생성됨.", answerList.get(0).getContent());
}
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: could not initialize proxy - no Session
예외 발생 흐름
questionRepository.findById(2) 호출 시 Question 엔터티가 데이터베이스에서 로드.)프록시는 실제 데이터베이스 액세스를 대체하는 가짜 객체.즉, questionRepository가 findById()메서드를 통해 Question 객체를 조회하고 나면 DB 세션이 끊어지기 때문
answerList 필드는 Question 엔터티에서 @OneToMany 관계로 정의된 컬렉션이고, 기본적으로 Lazy Fetching(fetch=FetchType.LAZY)으로 설정.
@OneToMany(fetch = FetchType.Lazy) -> @OneToMany(fetch = FetchType.Eager)@Entity
@Setter
@Getter
public class Question {
(생략)
@OneToMany(mappedBy = "question", fetch = FetchType.LAZY, cascade = CascadeType.REMOVE)
private List<Answer> answerList;
}
Ex
@OneToMany(mappedBy = "question", fetch = FetchType.LAZY, cascade = CascadeType.REMOVE)
private List<Answer> answerList;

Lazy Loading이 동작하려면 Hibernate Session이 열려 있어야 함.하지만 세션이 닫힌 후 프록시 객체가 접근하면, Hibernate는 데이터베이스에 접근할 수 없으므로 LazyInitializationException를 발생시킴.