SpringMVC3+Hibernate4問題:org.hibernate.HibernateException: No Session found for current thread
阿新 • • 發佈:2019-01-31
問: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是沒有經過事務加強處理的,故而沒有事務處理能力。
正確配置如下: 主配置檔案:(使用的是預設規則)springmvc配置檔案:use-default-filters="false"(不使用預設規則,自定義規則)<context:component-scan base-package="com" > <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" /> </context:component-scan>
修改之後就可以正常提交事務了。<context:component-scan base-package="com" use-default-filters="false"> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" /> </context:component-scan>