2014-03-27 140 views
0

對於我的EJB bean的某種原因,一個間接調用當我運行上面的設置的代碼與彈簧@Transactional註解EJB 3和Spring @Transactional

註釋一個DAO,我得到一個交易異常像下面

javax.ejb.EJBException: org.springframework.transaction.TransactionSystemException: Could not commit Hibernate transaction; nested exception is org.hibernate.TransactionException: commit failed 
at org.jboss.as.ejb3.tx.CMTTxInterceptor.handleExceptionInOurTx(CMTTxInterceptor.java:166) ~[jboss-as-ejb3-7.1.1.Final.jar!/:7.1.1.Final] 
at org.jboss.as.ejb3.tx.CMTTxInterceptor.invokeInOurTx(CMTTxInterceptor.java:230) ~[jboss-as-ejb3-7.1.1.Final.jar!/:7.1.1.Final] 
at org.jboss.as.ejb3.tx.CMTTxInterceptor.required(CMTTxInterceptor.java:304) ~[jboss-as-ejb3-7.1.1.Final.jar!/:7.1.1.Final] 
at org.jboss.as.ejb3.tx.CMTTxInterceptor.processInvocation(CMTTxInterceptor.java:190) ~[jboss-as-ejb3-7.1.1.Final.jar!/:7.1.1.Final] 
at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288) ~[jboss-invocation-1.1.1.Final.jar!/:1.1.1.Final] 
at org.jboss.as.ejb3.component.interceptors.CurrentInvocationContextInterceptor.processInvocation(CurrentInvocationContextInterceptor.java:41) ~[jboss-as-ejb3-7.1.1.Final.jar!/:7.1.1.Final] 
at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288) ~[jboss-invocation-1.1.1.Final.jar!/:1.1.1.Final] 
at org.jboss.as.ejb3.component.interceptors.LoggingInterceptor.processInvocation(LoggingInterceptor.java:59) ~[jboss-as-ejb3-7.1.1.Final.jar!/:7.1.1.Final] 
at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288) ~[jboss-invocation-1.1.1.Final.jar!/:1.1.1.Final] 
at org.jboss.as.ee.component.NamespaceContextInterceptor.processInvocation(NamespaceContextInterceptor.java:50) ~[jboss-as-ee-7.1.1.Final.jar!/:7.1.1.Final] 
at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288) ~[jboss-invocation-1.1.1.Final.jar!/:1.1.1.Final] 
at org.jboss.as.ejb3.component.interceptors.AdditionalSetupInterceptor.processInvocation(AdditionalSetupInterceptor.java:43) ~[jboss-as-ejb3-7.1.1.Final.jar!/:7.1.1.Final] 
at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288) ~[jboss-invocation-1.1.1.Final.jar!/:1.1.1.Final] 
at org.jboss.as.ee.component.TCCLInterceptor.processInvocation(TCCLInterceptor.java:45) ~[jboss-as-ee-7.1.1.Final.jar!/:7.1.1.Final] 
at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288) ~[jboss-invocation-1.1.1.Final.jar!/:1.1.1.Final] 
at org.jboss.invocation.ChainedInterceptor.processInvocation(ChainedInterceptor.java:61) ~[jboss-invocation-1.1.1.Final.jar!/:1.1.1.Final] 
at org.jboss.as.ee.component.ViewService$View.invoke(ViewService.java:165) ~[jboss-as-ee-7.1.1.Final.jar!/:7.1.1.Final] 
at org.jboss.as.ee.component.ViewDescription$1.processInvocation(ViewDescription.java:173) ~[jboss-as-ee-7.1.1.Final.jar!/:7.1.1.Final] 
at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288) ~[jboss-invocation-1.1.1.Final.jar!/:1.1.1.Final] 
at org.jboss.as.ejb3.component.interceptors.AsyncFutureInterceptorFactory$1$1.runInvocation(AsyncFutureInterceptorFactory.java:71) ~[jboss-as-ejb3-7.1.1.Final.jar!/:7.1.1.Final] 
at org.jboss.as.ejb3.component.interceptors.AsyncInvocationTask.run(AsyncInvocationTask.java:73) ~[jboss-as-ejb3-7.1.1.Final.jar!/:7.1.1.Final] 
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source) ~[na:1.6.0_29] 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) ~[na:1.6.0_29] 
at java.lang.Thread.run(Unknown Source) [na:1.6.0_29] 
at org.jboss.threads.JBossThread.run(JBossThread.java:122) ~[na:na] 

的事務管理我的bean定義看起來像

<bean id="transactionManager" 
    class="org.springframework.orm.hibernate4.HibernateTransactionManager"> 
    <property name="sessionFactory"> 
     <ref bean="sessionFactory" /> 
    </property> 
</bean> 

任何人都可以扔的是什麼這個問題有一些啓發,我應該如何correc它呢?

+0

我不認爲你提供了足夠的信息。我們可以看到一些正在運行的代碼嗎?也許在你提供的第一行之上有一點堆棧跟蹤? – jervine10

+0

您正在使用EJB,但正在嘗試本地事務,我希望您必須使用JTA事務來參與正在進行的事務。 –

回答

0

嘗試使用@TransactionAttribute(NOT_SUPPORTED)來標記您的EJB方法。但是,如果你想一起使用Spring和EJB,甚至是使用Hibernate(JPA),你應該只依賴容器服務:允許通過JBOSS引發JPA,從JNDI獲得Spring的事務管理器(剛夠添加<tx:jta-transaction-manager/>)等。

從其他方面來說,如果你有Spring,爲什麼你需要EJB?

+0

謝謝阿爾喬姆,我試着用@TransactionAttribute(NOT_SUPPORTED)註釋我的dao類,但它似乎不能解決問題。如果我使用,我該如何提供數據源.sessionFactory等。 –

+0

1.如果您使用JPA,爲什麼需要'sessionFactory'? 2.'DataSource'也必須被JBOSS容器拾取,你可以從JNDI中獲得它。 –