1. 程式人生 > >springMVC整合hibernate的時候資料插入需要flush問題

springMVC整合hibernate的時候資料插入需要flush問題

hibernate中openSession和getCurrentSession

openSession需要手動的管理事務,每次開啟一個新的session
getCurrentSession在當前執行緒中找一個session,如果沒有則新建一個。不需要手動close,但是需要定義事務管理

spring配合hibernate使用getCurrentSession

由於使用getCurrentSession需要使用事務,spring和hibernate整合的時候使用spring接管hibernate的事務
步驟如下:

1.需要在spring的web.xml中配置session open

web.xml加入配置

<!-- 配置Session -->
  <filter>  
    <filter-name>openSession</filter-name>  
    <filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class>  
  </filter>  
  <filter-mapping>  
    <filter-name>openSession</filter-name
>
<url-pattern>/*</url-pattern> </filter-mapping>

2.凡是加上事務的bean,必須用xml的方式配置,不能用註解

(事務可以使用註解,測試環境 spring3.2.10+hibernate4.1.9)
例如:SecurityService類中有配置事務
application.xml

<bean id="securityService" class="nanhu.lf.service.SecurityService" />

SecurityService類

package
nanhu.lf.service; import java.util.List; import nanhu.lf.dao.UserDAO; import nanhu.lf.model.TestObj; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; public class SecurityService { @Autowired private UserDAO userDAO; @Transactional public void saveUser(TestObj user){ userDAO.saveUser(user); } @Transactional public List<TestObj> getAllUser(){ return userDAO.findAll(); } }

3.配置事務 (註解和xml方式都可以)

1.使用註解方式:

<!-- 配置註解管理事務-->
    <tx:annotation-driven transaction-manager="txManager"/>

2.使用xml方式

<!-- 這是事務通知操作,使用的事務管理器引用自 transactionManager   -->
   <tx:advice id="txAdvice" transaction-manager="txManager">    
       <tx:attributes>    
           <tx:method name="save*" propagation="REQUIRED" read-only="false"/>    
           <tx:method name="delete*" propagation="REQUIRED" />    
           <tx:method name="get*" propagation="REQUIRED" read-only="true"/>    
           <tx:method name="query*" propagation="REQUIRED" read-only="true"/>    
           <tx:method name="*" propagation="REQUIRED" />    
       </tx:attributes>    
   </tx:advice>  

    <!-- 需要引入aop的名稱空間      -->
   <aop:config>    
       <aop:pointcut id="serviceMethods" expression="execution(* nanhu.lf.service.*.*(..))" />        
       <aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethods" />    
   </aop:config> 

事務管理器如下:

<!-- 事物管理器 -->
    <bean id="txManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory"></property>
    </bean>

這個也許是使用springMVC之後導致的一個bug吧,或者還有什麼其他的配置,網上很多說法,感覺最靠譜的還是 spring容器和springMVC容器之間存在父子關係,那麼裝配帶有事務的bean的時候可能出現重複,所以才會載入的是沒有事務的service,具體還不清楚。

在spring的配置檔案中,和MVC相關的bean配置在spring-servlet.xml中,其他的放在是spring.xml(application.xml)中。