ejb3和Spring@Transactional

ejb3和Spring@Transactional,spring,hibernate,jboss,transactions,ejb,Spring,Hibernate,Jboss,Transactions,Ejb,出于某种原因,我的一个ejbbean间接调用了一个用springs@Transactional注释的DAO 当我使用上面的设置运行代码时,我会得到一个如下所示的事务异常 javax.ejb.EJBException: org.springframework.transaction.TransactionSystemException: Could not commit Hibernate transaction; nested exception is org.hibernate.Tra

出于某种原因,我的一个ejbbean间接调用了一个用springs@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>


有人能解释一下问题是什么以及我应该如何纠正它吗?

试着用
@TransactionAttribute(不受支持)
标记您的EJB方法

然而,如果您想同时使用Spring和EJB,甚至使用Hibernate(JPA),您应该只依赖容器服务:允许通过JBOSS提升JPA,从JNDI获取Spring事务管理器(刚好可以添加
)等等


另一方面,若你们有Spring,为什么你们需要EJB?

我认为你们并没有提供足够的信息。我们能看到一些正在运行的代码吗?也许在您提供的第一行之上有一点堆栈跟踪?您正在使用EJB,但正在尝试本地事务,我希望您必须使用JTA事务来参与正在进行的事务。感谢Artem,我尝试使用@TransactionAttribute(不受支持)注释我的dao类,它似乎无法解决问题。如果使用,如何提供datasource.sessionFactory等1。如果使用JPA,为什么需要
sessionFactory
?2. <代码>数据源也必须由JBOSS容器获取,您可以从JNDI获取Spring的代码。