看着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:
另有多個數據源的問題:
原來舊版本沒有的問題...就是有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