2016-10-03 96 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的實際交易可用於當前線程 - 無法可靠地處理'刪除'調用;嵌套異常是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

相關問題