2014-04-26 75 views
2

我目前正在使用Spring和Hibernate設置一個項目。經過幾個其他問題,我得到了下一個問題:PHibernate + Spring:javax.persistence.TransactionRequiredException:沒有事務正在進行

無論如何。當致電entityManager.flush()我收到一個例外:javax.persistence.TransactionRequiredException: no transaction is in progress

我已經用@Transactional註釋了我的課,但它仍然無法正常工作。

我在這裏讀取serval線程,其中人們遇到類似問題,但解決方案始終爲<tx:annotation-driven transaction-manager="transactionManager" />。但我已經有了這個配置。

我不知道什麼樣的代碼或文件,我應該提供你,所以你可以在這裏找到整個項目: https://drive.google.com/file/d/0B7Exc4dHICl-UDN3ZEJnbS1FZFk/edit?usp=sharing

預先感謝您。

回答

0

Here@Transactional無法正常工作時發佈關於配置的信息 - 您是否在appContext.xml中設置了標籤<context:component-scan>?這兩個都掃描bean的包來註冊並激活註釋。如果您沒有<context:component-scan>,則@Transactional註釋將不會將該方法包裝在事務中。

0

我已經找到解決方案,通過實施ApplicationListener<ContextRefreshedEvent>並將自我引用服務調用。

問題出現是因爲在調用方法中沒有開始事務,並且後續的方法調用是內部引用,所以沒有創建新的事務。所以,我必須使我的調用方法成爲事務性的,或者創建一個內部引用並通過該引用調用後續方法。

你必須重寫以下方法

private MyService myService = myService;  
@Override 
     public void onApplicationEvent(ContextRefreshedEvent event) { 
      myService = event.getApplicationContext().getBean(MyService.class); 
     } 

然後使用myService.myMethod()而不是在任何你想交易活躍myMethod()

相關問題