1. 程式人生 > >SpringMVC3+Hibernate4問題:org.hibernate.HibernateException: No Session found for current thread

SpringMVC3+Hibernate4問題:org.hibernate.HibernateException: No Session found for current thread

問:1:org.hibernate.HibernateException: No Session found for current thread

解決方法:
在web.xml中新增openSessionInViewFilter
<filter>
        <filter-name>openSessionInViewFilter</filter-name>
        <filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class>
        <init-param>
            <param-name>singleSession</param-name>
            <param-value>true</param-value>
        </init-param>
</filter>
<filter-mapping>
        <filter-name>openSessionInViewFilter</filter-name>
        <url-pattern>*.do</url-pattern>
</filter-mapping>

注意:singleSession為true;不要漏掉filter-mapping. 這樣在dao中注入sessionFactory;就能通過this.sessionFactory.getCurrentSession()方法取到Session了。

問題2:解決上述問題後,hibernate不能自動提交事務,更新資料到資料庫中

解決方法:
原因:spring的主配置檔案和springmvc的配置檔案,重複掃描事務和bean的註解,導致失效。 ServletContextListener產生的是父容器,springMVC產生的是子容器,子容器中的Controller進行裝配時,裝配了掃描到的@Service註解的例項,而非由父容器進行初始化的例項,所以此時得到的Service是沒有經過事務加強處理的,故而沒有事務處理能力。
正確配置如下: 主配置檔案:(使用的是預設規則)
<context:component-scan base-package="com" >
		<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" /> 
</context:component-scan>
springmvc配置檔案:use-default-filters="false"(不使用預設規則,自定義規則)
<context:component-scan base-package="com" use-default-filters="false">
		<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" /> 
</context:component-scan>
修改之後就可以正常提交事務了。