Java Hibernate会话未绑定到使用AOP切入点事务管理器的线程
我正在使用Spring4.0.3和Hibernate3.6.10。我对Spring和Hibernate很有经验,但是我从零开始了一个新项目 谷歌搜索了我的错误,发现了大约六个错误,我认为它们都没有帮助 以下是我的spring配置文件中的相关定义:Java Hibernate会话未绑定到使用AOP切入点事务管理器的线程,java,spring,hibernate,transactions,Java,Spring,Hibernate,Transactions,我正在使用Spring4.0.3和Hibernate3.6.10。我对Spring和Hibernate很有经验,但是我从零开始了一个新项目 谷歌搜索了我的错误,发现了大约六个错误,我认为它们都没有帮助 以下是我的spring配置文件中的相关定义: <!-- the transactional advice (what happens; see the <aop:advisor/> bean below) --> <tx:advice id="txAdvice" tr
<!-- the transactional advice (what happens; see the <aop:advisor/> bean below) -->
<tx:advice id="txAdvice" transaction-manager="txManager">
<!-- the transactional semantics... -->
<tx:attributes>
<!-- all methods starting with get are read-only -->
<tx:method name="get*" propagation="REQUIRED" read-only="true"/>
<!-- other methods use the default transaction settings (see below) -->
<tx:method name="" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<!-- ensure that the above transactional advice runs for any execution
of an operation defined by the FooService interface -->
<aop:config>
<aop:pointcut id="loaderOperation" expression="execution(* com.corrisoft.air.testload.loader.*.load(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="loaderOperation"/>
</aop:config>
<!-- similarly, don't forget the PlatformTransactionManager -->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="airDatabase"/>
</bean>
<util:list id="loaders" value-type="com.corrisoft.air.testload.loader.Loader">
<ref bean="versionLoader"/>
</util:list>
<bean id="versionLoader" class="com.corrisoft.air.testload.loader.DeviceSoftwareLoader" init-method="init">
<property name="versionDAO" ref="versionDAO"/>
</bean>
这是我得到的堆栈跟踪:
org.hibernate.HibernateException: No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here
org.springframework.orm.hibernate3.SpringSessionContext.currentSession(SpringSessionContext.java:65)
org.hibernate.impl.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:687)
com.corrisoft.air.data.hibernate.HibernateDAO.getCurrentSession(HibernateDAO.java:42)
com.corrisoft.air.data.hibernate.HibernateDAO.create(HibernateDAO.java:62)
**com.corrisoft.air.testload.loader.DeviceSoftwareLoader.load(DeviceSoftwareLoader.java:63)**
com.corrisoft.air.testload.loader.DeviceSoftwareLoader$$FastClassBySpringCGLIB$$1d5a010d.invoke(<generated>)
org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:711)
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:98)
org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:262)
org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:95)
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:644)
com.corrisoft.air.testload.loader.DeviceSoftwareLoader$$EnhancerBySpringCGLIB$$39a06195.load(<generated>)
com.corrisoft.air.testload.LoadAir.load(LoadAir.java:37)
com.corrisoft.air.web.ReloadController.handleRequestInternal(ReloadController.java:25)
org.springframework.web.servlet.mvc.AbstractController.handleRequest(AbstractController.java:154)
org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:50)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:938)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:870)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:852)
javax.servlet.http.HttpServlet.service(HttpServlet.java:618)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
org.hibernate.HibernateException:没有绑定到线程的hibernate会话,并且配置不允许在此创建非事务会话
org.springframework.orm.hibernate3.SpringSessionContext.currentSession(SpringSessionContext.java:65)
org.hibernate.impl.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:687)
com.corrisoft.air.data.hibernate.HibernateDAO.getCurrentSession(HibernateDAO.java:42)
com.corrisoft.air.data.hibernate.HibernateDAO.create(HibernateDAO.java:62)
**com.corrisoft.air.testload.loader.DeviceSoftwareLoader.load(DeviceSoftwareLoader.java:63)**
com.corrisoft.air.testload.loader.DeviceSoftwareLoader$$FastClassBySpringCGLIB$$1d5a010d.invoke()
org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:711)
org.springframework.aop.framework.ReflectiveMethodInvocation.procedue(ReflectiveMethodInvocation.java:157)
org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:98)
org.springframework.transaction.interceptor.TransactionSpectSupport.invokeWithinTransaction(TransactionSpectSupport.java:262)
org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:95)
org.springframework.aop.framework.ReflectiveMethodInvocation.procement(ReflectiveMethodInvocation.java:179)
org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
org.springframework.aop.framework.ReflectiveMethodInvocation.procement(ReflectiveMethodInvocation.java:179)
org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:644)
com.corrisoft.air.testload.loader.DeviceSoftwareLoader$$EnhancerBySpringCGLIB$$39a06195.load()
com.corrisoft.air.testload.LoadAir.load(LoadAir.java:37)
com.corrisoft.air.web.ReloadController.handleRequestInternal(ReloadController.java:25)
org.springframework.web.servlet.mvc.AbstractController.HandlerRequest(AbstractController.java:154)
org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:50)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:938)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:870)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:852)
javaservlet.http.HttpServlet.service(HttpServlet.java:618)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
javaservlet.http.HttpServlet.service(HttpServlet.java:725)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
我很困惑,因为粗体的行是我希望事务包装的行。当我查看堆栈跟踪时,我觉得它已经为我启动了一个事务。那么,为什么我会出错呢
下面是我的hibernate和DAO设置:
<jee:jndi-lookup id="airDatabase" jndi-name="java:comp/env/jdbc/airDB"/>
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="airDatabase" />
<property name="packagesToScan">
<list>
<value>com.corrisoft.air.model</value>
</list>
</property>
<property name="hibernateProperties">
<value>
hibernate.dialect=org.hibernate.dialect.MySQLDialect
hibernate.hbm2ddl.auto=create
</value>
</property>
</bean>
<bean id="versionDAO" class="com.corrisoft.air.data.hibernate.DeviceSoftwareVersionHibernateDAO" init-method="init">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
com.corrisoft.air.model
hibernate.dialogue=org.hibernate.dialogue.mysqldialogue
hibernate.hbm2ddl.auto=create
配置中有一个输入错误:将“其他方法”tx匹配更改为以下内容:
<tx:method name="*" propagation="REQUIRED"/>
这是打字错误吗tx:method name=“”
?我从找到的一个示例中复制了这一点。我相信这意味着所有其他的方法。试着这样做:
@andrestefan似乎已经做到了。谢谢请张贴作为答案,以便我可以标记它。