를이 다음과 같은 클래스입니다 : Framwork + 스프링 데이터 JPA 재생 : LazyInitializationException이
@Entity
public class Question {
@Id
public Long id;
public String name;
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.PERSIST)
@JoinColumn(name = "OWNER_ID", referencedColumnName = "QUES_ID")
public List<Choice> choices = new ArrayList<>();
}
@Named
@Singleton
public interface QuestionRepository extends CrudRepository<Question , Long> {
Question findByName(String name);
}
그리고 getQuestion에서 나는이 다음과 같은 파일을 가지고있는 컨트롤러 파일
@Transactional
public Result getQuestion() {
List<Choices> list = this.questionRepository.findByName("name").choices;
list.size();
return ok();
}
는 list.size()에서
() 열려있는 세션이 없기 때문에 LazyInitializationException을 던졌습니다.나는 페치 유형을 EAGER로 바꾸거나 QuestionRepos의 함수 정의 위의 JPQL 쿼리를 사용한다는 것을 알고 있습니다. itory는 그것을 해결할지도 모르지만, 도움이되지 않는 곳에서 나는 게으른 가져 오기를 요구할 것입니다.
getQuestion() 함수의 전체 코드가 단일 세션/트랜잭션을 사용하거나 단일 세션/트랜잭션 내에서 전체 요청을 더 잘 수행하게하려면 어떻게해야합니까? 나는 몇 달 동안 이걸로 붙어있어 도와주세요.
스프링은'getQuestion'에서 트랜잭션을 시작할 수없고 스프링 데이터의 트랜잭션을 사용하고 있다고 생각합니다. –
모든 리포지토리 구현은 기본적으로 트랜잭션입니다. 'findByName'을 호출하면 스프링이 변환을 시작하고 메서드가 반환되면 트랜잭션이 커밋되고 세션이 닫히므로'list.size()'는'LazyInitializationException'을 throw합니다. 플레이/스프링 통합을 확인하십시오. –
당신은 @Query없이 솔루션을 원한다고 언급 한 것처럼 http://stackoverflow.com/questions/26611173/jpa-jta-transactional-spring-annotation/26615390#26615390 –