2016-10-03 4 views
8

Spring JPA 리파지토리 트랜잭션성에 대해 1 개의 빠른 질문. 나는 트랜잭션으로 표시되고 봄 JPA 저장소 방법을Spring JPA 저장소 트랜잭션 성

userRegistrationRepository.deleteByEmail(email); 

를 호출하지 않는 서비스를 그리고 그것은

@Repository 
public interface UserRegistrationRepository extends JpaRepository<UserRegistration, Long> { 

    UserRegistration findByEmail(String email); 

    void deleteByEmail(String email); 

} 

로 정의 문제는 그것이 실제 거래와 없음의 EntityManager "로 실패하다 현재 스레드에서 사용 가능 - 'remove'호출을 안정적으로 처리 할 수 ​​없으며 중첩 예외는 javax.persistence.TransactionRequiredException "예외입니다.

좋아, 서비스 또는deleteByEmail (..) 트랜잭션으로 방법을 표시하여 그것을 해결할 수 있지만, 지금은 충돌하는 이유는 이해할 수 없습니다. Spring 설명서에 명시 적으로 "저장소 인스턴스의 CRUD 메소드는 기본적으로 트랜잭션입니다."(http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#transactions), 분명히이 것은 아닙니다 ...이 문장은 CrudRepository의 멤버와 관련이 있습니까?

ps : 스프링 데이터 용 JPA 1.9.4

답변

10

맞습니다. CRUD 메서드 (CrudRepository 메서드) 만 기본적으로 트랜잭션으로 표시됩니다. 사용자 지정 쿼리 메서드를 사용하는 경우 명시 적으로이 메서드를 @Transactional 주석으로 표시해야합니다.

@Repository 
public interface UserRegistrationRepository extends JpaRepository<UserRegistration, Long> { 

    UserRegistration findByEmail(String email); 

    @Transactional 
    void deleteByEmail(String email); 

} 

또한 서비스 방법 대신 저장소 인터페이스 방법을 표시 한 결과에 대해서도 유의해야합니다. 그런 다음 기본 트랜잭션 전달 구성 (Propagation.REQUIRED)를 사용하는 경우 : 외부 트랜잭션 구성이 사용 된 실제 하나 를 결정으로 저장소에서

트랜잭션 구성은 다음 을 무시 될 것입니다.

http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#transactions

관련 문제