java.lang.IllegalStateException: No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here這個異常java
這個錯誤,網上說的緣由一大推,反正我這個出的問題 是由於 雖然我在 spring 裏把事務都配置好了,結果運行就出現這個錯誤,看看配置都沒什麼問題,都是網上 案例 照 寫編碼的,仍是錯的,結果發現是由於 我 在拿 spring 中 的 service 或 dao bean 時 拿的方式錯了。spring
FooService fooService = ctx.getBean("xxxxDao",FooService.class);
//不能直接中bean中拿目標代理對象,而是從事務bean中去拿目標代理對象,這樣拿到的代理纔有spring 事務管理
//FooService fooService = (FooService) ctx.getBean("fooService");
---》 如上邊 spring 中是對 FooService 接口 的 子類 xxxFooService 進行 事務管理,原來習慣直接
FooService fooService = (FooService) ctx.getBean("fooService"); -- fooService 爲spring中的bean
其實錯的,拿到的雖然也是 子類 xxxFooService 的bean ,可是這個 bean是沒有 spring 事務管理的,那怎麼才能拿到有spring 管理的bean呢,即
FooService fooService = ctx.getBean("xxxxDao",FooService.class); -- 這個 xxxxDao 爲 TransactionProxyFactoryBean 的bean 或 是其 子類 bean(當其爲abstract時必須拿其子類bean)
上邊第一個參數 爲 事務bean ,第二個參數 爲咱們想要 的 代理目標對象(必須用接口類,不可用具體實現類),這樣拿到的 service 纔有 spring 事務管理,改正後上邊的報錯就不會出現了。
注: 上邊的這個報錯問題通常都是 沒有spring 事務管理纔會報的錯,因此遇到這種問題先看看本身spring配置的事務 是否有問題,再看看本身拿的事務管理對象bean 的拿 法 是否有問題,上邊例子中就是配置沒問題,拿法有問題,
諸如還有其餘的一些問題 能形成上邊的錯誤,但 其餘的問題都 是要麼配置錯誤要麼拿 bean方式錯誤。再舉例:假如 用攔截器 進行事務管理配置,假如 :
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> <property name="beanNames"> <list> <!--一切 和 *Service 有關的都會被攔截--> <value>DefaultFooService</value> <!--<value>*Service</value>--> </list> </property> <property name="interceptorNames"> <list> <value>transactionInterceptor</value> </list> </property> </bean>
如上邊攔截 位置 應該是 攔截 全部對象 名 帶有Service的類,假如 要事務管理的對象 在spring 中 bean 的名字 叫xxx 那此就不會 被攔截,那最終就不會有事務管理,那也會報上邊的錯誤。那由於 要事務管理的對象在spring中bean id 叫 xxx ,那 此配置 *xxx 或 直接就 xxx 就能正常 攔截了。就不會報上邊錯誤了。同理就是說明一個問題 ,只要 要spring 事務 管理的 bean 對象 被 拿取到時,再進行 操做時若是 這個對象自己不在 事務管理中的 話就會報上邊的問題。這個對象怎麼會沒有事務管理,要麼 配置錯誤,要麼拿這個bean 對象 時錯誤。