2016-10-03 2 views
8

Spring JPAリポジトリのトランザクション性について1つの簡単な質問。 私はトランザクションとしてマークされていないサービスがあり、春JPAリポジトリ方法Spring JPAリポジトリトランザクション性

userRegistrationRepository.deleteByEmail(email); 

を呼び出し、問題は、それは実際の取引で「ないのEntityManagerで失敗したということです

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

    UserRegistration findByEmail(String email); 

    void deleteByEmail(String email); 

} 

として定義されます現在のスレッドで利用可能 - 確実に 'remove'コールを処理できません;入れ子になった例外はjavax.persistence.TransactionRequiredException "例外です。

[OK]を、私はサービスまたはdeleteByEmail(..)トランザクションとして方法をマークすることによってそれを解決することができますが、それが今クラッシュし、なぜ私は理解できません。 Springのドキュメントには、「リポジトリインスタンスのCRUDメソッドがデフォルトでトランザクションであることが明示されています。」(http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#transactions)、明らかにこれはそうではありません...このステートメントはCrudRepositoryのメンバのみに関連していますか?

ps:これはSpringデータ用です。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)を使用している場合:外側のトランザクションの構成が使用される実際の1 を判断して、リポジトリで

トランザクション構成は、 を無視することになります。

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