转升级hibernate>4,spring>3.1笔记

看着hibernate和spring的RELEASE版出来很久了.心痒就想升级一下.结果问题真来的不少 ...记录下来.

spring升到3.1倒是简单,删除旧包,加新包,然后配置的  xsi:schemaLocation 版本由 3.0 改写成 3.1 其它基本可以原封不动的运行了.

接着还是改spring里的 hibernate (使用 annotation) bean 配置.

先是SessionFactory 的 org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean 要改成org.springframework.orm.hibernate4.LocalSessionFactoryBean 还以为只要把 hibernate3 换成4就可以了,结果发现spring 3.1里没有这个类了.annotation也是使用的LocalSessionFactoryBean.这个不改会报 cache.XXX 找不到类的错误.

接着把 org.springframework.orm.hibernate3.HibernateTransactionManager 改成 org.springframework.orm.hibernate4.HibernateTransactionManager

然后移除hibernateTemplate.这个很重要,spring 3.1不再支持hibernateTemplate了.不晓得什么原因...没深究

然后就是大面积的修改类了...

因为不再使用 hibernateTemplate,都要改成 sessionFactory.getCurrentSession()...

这个转变其实也不算难,唯一有些区别的是对 DetachedCriteria 的操作.

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

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

Criteria 去看看 hibernate的官方帮助里面有很详细的说明,足以轻松替换掉 hibernateTemplate , 改完基本也就升级完成了.

MVC OpenSessionInViewFilter:

[html]
view plain
copy

  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. <filter-mapping>
  14. <filter-name>openSessionInViewFilter</filter-name>
  15. <url-pattern>/*</url-pattern>
  16. </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

时间: 2024-10-06 21:36:36

转升级hibernate>4,spring>3.1笔记的相关文章

struts2,hibernate,spring整合笔记(2)

上一话struts2,hibernate,spring整合笔记(1) 接下来继续 配置完struts之后就要开始hibernate的配置 hibernate的环境并不依赖web开发环境,在我第一次配置hibernate时用的javase, 在window-> preferences->java->user libraries,创建一个新的Use libraries,添加相应的jar包 再在项目build path->build configurationpath->add l

struts2,hibernate,spring整合笔记(3)

struts2,hibernate,spring整合笔记(1) struts2,hibernate,spring整合笔记(2) 配好struts和hibernate就要开始spring了 老规矩,还是先导入jar包 spring.jar aspectjrt.jar aspectjwerver.jar cglib-nodep-2.1_3.jar common-logging.jar c3p0-0.9.1.jar 之后加入配置文件src目录下applicationContext.xml <?xml

Spring Batch学习笔记二

此系列博客皆为学习Spring Batch时的一些笔记: Spring Batch的架构 一个Batch Job是指一系列有序的Step的集合,它们作为预定义流程的一部分而被执行: Step代表一个自定义的工作单元,它是Job的主要构件块:每一个Step由三部分组成:ItemReader.ItemProcessor.ItemWriter:这三个部分将执行在每一条被处理的记录上,ItemReader读取每一条记录,然后传递给ItemProcessor处理,最后交给ItemWriter做持久化:It

spring框架搭建笔记

◆简介 目的:解决企业应用开发的复杂性 功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能 范围:任何Java应用 Spring 框架是一个分层架构,由 7 个定义良好的模块组成.Spring 模块构建在核心容器之上,核心容器定义了创建.配置和管理 bean 的方式. 组成 Spring 框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现.每个模块的功能如下: ? 核心容器:核心容器提供 Spring 框架的基本功能.核心容器的主要组件是 BeanFac

Spring MVC 学习笔记(二):@RequestMapping用法详解

一.@RequestMapping 简介 在Spring MVC 中使用 @RequestMapping 来映射请求,也就是通过它来指定控制器可以处理哪些URL请求,相当于Servlet中在web.xml中配置 <servlet>     <servlet-name>servletName</servlet-name>     <servlet-class>ServletClass</servlet-class> </servlet>

[Spring MVC]学习笔记--DispatcherServlet

在上一篇我们介绍了Servlet,这一篇主要来看一下MVC中用到的DispatcherServlet(继承自HttpServlet). 1. DispatcherServlet在web.xml中被声明. <web-app> <servlet> <servlet-name>example</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet&l

条理清晰的搭建SSH环境之整合Hibernate和Spring

上篇博客整合了Struts和Spring,感觉很简单,这篇博客主要讲述Hibernate和Spring的整合. 如果说上篇博客中的整合是以为Spring的IOC可以管理对象,让Struts2里的对象管理变得更方便.那么Hibernate与Spring的整合的好处就是,可以将SessionFactory的实例交由Spring容器管理,那么我们只需要这一个实例就可以了.还有一点就是声明式的事务管理非常方便. 需要以下配置: 1.配置applicationContext.xml文件,添加配置sessi

Struts、Hibernate和Spring的整合

Spring整合Hibernate Spring以其开放性,能与大部分ORM框架良好的整合.这样Spring就能轻松地使用ORM. Spring提供了DAO支持,DA0组件是应用的持久层访问的重要组件,我们把主要精力集中在数据的管理口上. 此外,Spring还提供了一致的异常抽象,不需要在编码时显示的捕获各种特定的异常. 通过Bibernate进行数据持久层操作时,Hibernate的Session接口提供了基本的数据访问方法,获得Hibernate Session对象方法是要实现Hiberna

Hibernate 与 Spring 的整合

刚刚学习了hibernate和Spring的整合,现在来总结一下. 以实现一个功能为例,与大家分享一下整个过程. 需要实现的功能:建立一个Person类,该类包括name,sex,age,birthaday四个属性,我们要实现通过hibernate和Spring往数据库中添加一个person对象. 下面是整个个过程: 1.新建java项目,并倒包(包括spring,hibernate,jdbc,c3p0等) 2.添加外部的c3p0连接池配置文件 3.实体类及其映射文件和hibernate配置文件