2014-12-14 2 views
3

를이 다음과 같은 클래스입니다 : 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() 함수의 전체 코드가 단일 세션/트랜잭션을 사용하거나 단일 세션/트랜잭션 내에서 전체 요청을 더 잘 수행하게하려면 어떻게해야합니까? 나는 몇 달 동안 이걸로 붙어있어 도와주세요.

+0

스프링은'getQuestion'에서 트랜잭션을 시작할 수없고 스프링 데이터의 트랜잭션을 사용하고 있다고 생각합니다. –

+0

모든 리포지토리 구현은 기본적으로 트랜잭션입니다. 'findByName'을 호출하면 스프링이 변환을 시작하고 메서드가 반환되면 트랜잭션이 커밋되고 세션이 닫히므로'list.size()'는'LazyInitializationException'을 throw합니다. 플레이/스프링 통합을 확인하십시오. –

+0

당신은 @Query없이 솔루션을 원한다고 언급 한 것처럼 http://stackoverflow.com/questions/26611173/jpa-jta-transactional-spring-annotation/26615390#26615390 –

답변

2

Spring 데이터 JPA 설명서

3.6.1. 트랜잭션 쿼리 메서드 쿼리 메서드를 트랜잭션 방식으로 허용하려면 정의한 리포지토리 인터페이스에서 @Transactional을 사용하기 만하면됩니다. 쿼리 방법

@Transactional(readOnly = true) 
public interface UserRepository extends JpaRepository<User, Long> { 

    List<User> findByLastname(String lastname); 

    @Modifying 
    @Transactional 
    @Query("delete from User u where u.active = false") 
    void deleteInactiveUsers(); 

}

에서 @Transactional을 사용

예 57. 일반적으로 당신은 쿼리 메소드의 대부분은 데이터를 읽으로 읽기 전용 플래그가 true로 설정하고 싶을 것이다. 반면 deleteInactiveUsers()는 @Modifying 주석을 사용하고 트랜잭션 구성을 재정의합니다. 따라서이 메소드는 readOnly 플래그를 false로 설정하여 실행됩니다.

http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#transactional-query-methods

그래서 당신의 저장소 인터페이스에 트랜잭션 주석을 추가 할 수 있습니다.

+0

을 참조 할 수 있습니다. UserRepository 외부에서 세션/트랜잭션을 사용할 수있게합니다. – AbrahamDaniel

+0

쿼리가 필요하지 않습니다. 인터페이스에 Transactional을 추가하기 만하면됩니다. – mavarazy

+0

Transaction dint work를 추가하면 getQuestion은 내 컨트롤러 클래스의 멤버이고 저장소 인터페이스가 아닙니다. – AbrahamDaniel

관련 문제