轉升級hibernate>4,spring>3.1筆記

看着hibernate和spring的RELEASE版出來好久了.心癢就想升級一下.結果問題真來的很多 ...記錄下來. html

spring升到3.1卻是簡單,刪除舊包,加新包,而後配置的  xsi:schemaLocation 版本由 3.0 改寫成 3.1 其它基本能夠原封不動的運行了. spring


接着仍是改spring裏的 hibernate (使用 annotation) bean 配置. session

先是SessionFactory 的 org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean 要改爲org.springframework.orm.hibernate4.LocalSessionFactoryBean 還覺得只要把 hibernate3 換成4就能夠了,結果發現spring 3.1裏沒有這個類了.annotation也是使用的LocalSessionFactoryBean.這個不改會報 cache.XXX 找不到類的錯誤. app

接着把 org.springframework.orm.hibernate3.HibernateTransactionManager 改爲 org.springframework.orm.hibernate4.HibernateTransactionManager url

而後移除hibernateTemplate.這個很重要,spring 3.1再也不支持hibernateTemplate了.不曉得什麼緣由...沒深究 spa

而後就是大面積的修改類了... .net

由於再也不使用 hibernateTemplate,都要改爲 sessionFactory.getCurrentSession()... hibernate

這個轉變其實也不算難,惟一有些區別的是對 DetachedCriteria 的操做. orm

hibernateTemplate.findByCriteria (DetachedCriteria,first,max) 換成 DetachedCriteria.getExecutableCriteria(sessionFactory.getCurrentSession()).setFirstResult(first).setMaxResults(max).list() htm

直接使用 sessionFactory.getCurrentSession().createCriteria(XXX.class) 代替 DetachedCriteria 是最簡單的了.

Criteria 去看看 hibernate的官方幫助裏面有很詳細的說明,足以輕鬆替換掉 hibernateTemplate , 改完基本也就升級完成了.

MVC OpenSessionInViewFilter:

  1. <filter>  
  2.         <filter-name>openSessionInViewFilter</filter-name>  
  3.         <filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class>  
  4.         <init-param>  
  5.             <param-name>singleSession</param-name>  
  6.             <param-value>true</param-value>  
  7.         </init-param>  
  8.         <init-param>  
  9.             <param-name>sessionFactoryBeanName</param-name>  
  10.             <param-value>mySessionFactory</param-value>  
  11.         </init-param>  
  12. </filter>  
  13.       
  14. <filter-mapping>  
  15.         <filter-name>openSessionInViewFilter</filter-name>  
  16.         <url-pattern>/*</url-pattern>  
  17. </filter-mapping>  


另有多個數據源的問題:

原來舊版本沒有的問題...就是有2個數據源,原先定義的2個sessionFactory 都能正常使用,可是升級後,第二個出現 No Session found for current thread 的問題.

能夠簡單用下面的方法解決這個問題.保險的話仍是用JTA 去實現比較好...

spring配置裏定義2個 transactionManager,而後 tx:annotation-driven 默認會使用名爲 transactionManager 的那個.

<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory1"/>
</bean>
<bean id="transactionManager2" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory2"/>
</bean>

<tx:annotation-driven transaction-manager="transactionManager"/>

接着在類裏用到第二個 sessionFactory 的方法上再加上  @Transactional(value="transactionManager2")

@Transactional
public void method1(){

    method2()

}

@Transactional(value="transactionManager2")
public void method2(){

    //這裏用到了 sessionFactory2

}


由於個人第二個數據源是隻讀,因此也就沒去判斷這個事務是否會正常回滾.理論上是不會回滾的...


==================================================================

附多數據源:

http://www.360doc.com/content/09/1222/17/18042_11742680.shtml

http://www.cnblogs.com/sky7034/archive/2011/08/11/2134411.html

http://blog.csdn.net/wangdonghua2261/article/details/3872975

相關文章
相關標籤/搜索