`
godo121
  • 浏览: 53233 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

spring升级到3.1.1 hibernate升级到4备忘

阅读更多
年初两个版本刚刚发布,还处于“血淋淋”的边缘,花了两天时间把所做的基于sh的一个框架进行升级,其过程有些纠结,写在这里做一备忘。

为什么要升级?升级的理由一个是hibernate4支持multi-tenant多租户模式,对于提供saas应用的项目来说,有这个与没这个有很大不同,尽管我已经在一个项目中实现了多租户模式,跟hibernate要做的第二种模式类似;另一个理由就是spring支持servlet3.0,并且对提供cache api,速度当然是主要考虑点。

没想到遇到很多问题,按网络流行语说是有点“蛋疼”。

幸亏框架是用maven进行管理,升级版本过程比较顺利,主要改写pom中的依赖:
hibernate pom dependency:

<dependency>
      	<groupId>org.hibernate</groupId>
      	<artifactId>hibernate-entitymanager</artifactId>
      	<version>4.1.1.Final</version>
</dependency>


spring pom dependency:

                <properties>
		     <spring.version>3.1.1.RELEASE</spring.version>
	        </properties>
                ....
                <dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>
			<version>${spring.version}</version>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-expression</artifactId>
			<version>${spring.version}</version>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-beans</artifactId>
			<version>${spring.version}</version>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>${spring.version}</version>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context-support</artifactId>
			<version>${spring.version}</version>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-orm</artifactId>
			<version>${spring.version}</version>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-oxm</artifactId>
			<version>${spring.version}</version>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-aop</artifactId>
			<version>${spring.version}</version>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-jdbc</artifactId>
			<version>${spring.version}</version>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>${spring.version}</version>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-web</artifactId>
			<version>${spring.version}</version>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-test</artifactId>
			<version>${spring.version}</version>
		</dependency>


注意maven2的repository还没有最新版本,需要配置:

<repository>
      <id>springsource-repo</id>
      <name>springsource repository</name>
      <url>http://repo.springsource.org/release</url>
</repository>

<repository>
      	<id>repository.jboss.org-public</id>
      	<name>JBoss repository</name>
      	<url>https://repository.jboss.org/nexus/content/groups/public</url>
 </repository>


由于spring3.1.1基于servlet3.0,因此需要将原先2.5的接口进行版本指定:

<dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.0.1</version>
        <scope>provided</scope>
</dependency>


spring3.1.1为了支持hibernate4,相关部分做了很大改动,除了一步步排错,别无他法,而且这些错误会因项目不同而异,即case by case根据项目实情来改。这里将常见的几个错误以及解决办法罗列如下:

错误1:java.lang.NoClassDefFoundError: org/hibernate/cache/CacheProvider
原因:spring的sessionfactory和transactionmanager与支持hibernate3时不同。
解决:
    <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        ...
    </bean>

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


错误2:java.lang.NoSuchMethodError:
org.hibernate.SessionFactory.openSession()Lorg/hibernate/classic/Session
原因:hibernate4之后,spring31把HibernateDaoSupport去除,包括数据访问都不需要hibernatetemplate,这意味着dao需要改写,直接使用hibernate的session和query接口。
解决:为了改写dao,足足花了一天时间,然后一个个接口进行单元测试,这是蛋疼的一个主要原因。

错误3:nested exception is org.hibernate.HibernateException: No Session found for current thread
原因:发现一些bean无法获得当前session,需要把之前一些方法的事务从NOT_SUPPORT提升到required,readonly=true
见https://jira.springsource.org/browse/SPR-9020
http://www.iteye.com/topic/1120924
解决:
<tx:advice id="baseServiceAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="get*" read-only="true" propagation="REQUIRED"/><!--之前是NOT_SUPPORT-->
            <tx:method name="find*" read-only="true" propagation="REQUIRED"/><!--之前是NOT_SUPPORT-->
            <tx:method name="save*" propagation="REQUIRED"/>
            <tx:method name="update*" propagation="REQUIRED"/>
            <tx:method name="remove*" propagation="REQUIRED"/>
            <tx:method name="add*" propagation="REQUIRED"/>
            <!--默认其他方法都是REQUIRED-->
            <tx:method name="*"/>
        </tx:attributes>
    </tx:advice>


错误4:与错误3报错类似,java.lang.NoSuchMethodError: org.hibernate.SessionFactory.openSession()Lorg/hibe
rnate/classic/Session;
        at org.springframework.orm.hibernate3.SessionFactoryUtils.doGetSession(S
essionFactoryUtils.java:324) [spring-orm-3.1.1.RELEASE.jar:3.1.1.RELEASE]
        at org.springframework.orm.hibernate3.SessionFactoryUtils.getSession(Ses
sionFactoryUtils.java:202) [spring-orm-3.1.1.RELEASE.jar:3.1.1.RELEASE]
        at org.springframework.orm.hibernate3.support.OpenSessionInViewFilter

原因:因为opensessioninview filter的问题,如果你的配置还是hibernate3,需要改为hibernate4
        <filter>
          <filter-name>openSessionInViewFilter</filter-name>
          <filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class>
        </filter>


以上这些错误仅仅是将原有代码部署发现的,当然,随着继续深入,可能会有更多问题暴露出来,包括代码需要调整,新feature要使用,任重而道远。
分享到:
评论

相关推荐

    spring-cloud-gateway-server-3.1.1-API文档-中文版.zip

    赠送jar包:spring-cloud-gateway-server-3.1.1.jar; 赠送原API文档:spring-cloud-gateway-server-3.1.1-javadoc.jar; 赠送源代码:spring-cloud-gateway-server-3.1.1-sources.jar; 赠送Maven依赖信息文件:...

    struts2.3.14+spring3.1.1+hibernate4.1.0 jar包

    Struts2.3.14、Spring3.1.1和Hibernate4.1.0是三个非常关键的Java开源框架,它们在企业级Web应用开发中有着广泛的应用。这个压缩包文件包含了这三个框架的jar包,是搭建基于SSH(Struts2、Spring、Hibernate)集成...

    spring-3.1.1源码和架包

    通过研究这些源码和文档,开发者不仅可以了解Spring 3.1.1版本的具体实现,还能学习到如何利用该框架来构建高效的企业级应用。对于那些希望成为Spring专家或者想要优化现有Spring应用的人来说,深入研究Spring 3.1.1...

    spring3.1.1jar及其关联jar

    org.springframework.aop-3.1.1.RELEASE org.springframework.asm-3.1.1.RELEASE org.springframework.aspects-3.1.1.RELEASE org.springframework.beans-3.1.1.RELEASE org.springframework.context.support-3.1.1....

    spring-web-3.1.1.RELEASE.jar.zip

    《Spring Web模块详解——基于3.1.1.RELEASE版本》 在Java世界里,Spring框架无疑是企业级应用开发的首选。它以其强大的功能、灵活的设计以及丰富的生态系统赢得了广大开发者的心。Spring框架的核心之一就是Spring ...

    SpringMVC + spring3.1.1 + hibernate4.1.0

    SpringMVC + Spring3.1.1 + Hibernate4.1.0 是一个经典的Java Web开发技术栈,用于构建高效、可扩展的企业级应用程序。在这个组合中,SpringMVC作为前端控制器处理HTTP请求,Spring框架提供了服务层管理和依赖注入,...

    Struts2.3.4 + Spring3.1.1 + Hibernate4.1.0集成

    Struts2.3.4、Spring3.1.1和Hibernate4.1.0是三个在Java开发领域中广泛使用的开源框架,它们分别是MVC框架、依赖注入框架和对象关系映射工具。这个集成项目(prj_mgr_04_ssh2)的目标是将这三个框架协同工作,以构建...

    maven之spring3.1.1+mybatis3.1.1整合

    以前用习惯了Hibernate, 开始接触Mybatis,同样是ORM, MyBatis确实很轻巧,正好也可以自己练练SQL,整合了maven版的spring3.1.1 + mybatis3.1.1,希望对你有帮助。

    struts-2.3.1+spring3.1.1+hibernate3.6.9整合&配置文件

    这个压缩包文件"struts-2.3.1+spring3.1.1+hibernate3.6.9整合&配置文件"提供了将这三个框架整合使用的配置和依赖。下面我们将详细讨论这三个框架以及它们的整合过程。 **Struts 2** 是一个基于MVC设计模式的Java ...

    struts2.3.7+spring3.1.1+hibernate4.1.6

    这个压缩包"struts2.3.7+spring3.1.1+hibernate4.1.6"提供了这三个框架的特定版本,适用于构建基于Java的企业级Web应用程序。 **Struts2** 是一个用于构建MVC(Model-View-Controller)架构的开源框架,它是Apache...

    Spring-3.1.1源码

    4. **MVC框架**:Spring MVC是Spring为Web开发提供的轻量级解决方案。在`org.springframework.web.servlet`包下,我们能找到DispatcherServlet、ModelAndView等关键类,它们协调控制器、视图和模型的交互。 5. **...

    struts2.2.3+spring3.1.1+hibernate4.0整合

    总的来说,Struts2.2.3+Spring3.1.1+Hibernate4.0的整合涉及了Web应用开发中的多个层面,包括MVC架构设计、依赖注入、面向切面编程和持久化管理。理解并掌握这些知识点,对于提升Java EE项目的开发效率和质量至关...

    spring-beans-3.1.1.RELEASE.jar

    spring-beans-3.1.1.RELEASE.jar

    spring3.1.1+struts2.3.1+hibernate3.3.2

    在"spring3.1.1+struts2.3.1+hibernate3.3.2"这个项目中,这三个框架的版本都是相对稳定的,能够提供良好的功能性和兼容性。 Spring 3.1.1是Spring框架的一个重要版本,它引入了若干改进和新特性。其中包括对Java...

    spring-cloud-gateway-server-3.1.1-API文档-中英对照版.zip

    赠送jar包:spring-cloud-gateway-server-3.1.1.jar; 赠送原API文档:spring-cloud-gateway-server-3.1.1-javadoc.jar; 赠送源代码:spring-cloud-gateway-server-3.1.1-sources.jar; 赠送Maven依赖信息文件:...

    spring 3.1.1

    5. **数据访问**:在数据访问层,Spring 3.1.1增强了对JPA、Hibernate和其他ORM框架的支持。同时,它还引入了`@Transactional`注解的改进,使得事务管理更加灵活和声明式。 6. **依赖注入**:在Spring 3.1.1中,...

    Spring3.1.1

    开发者通常将这些库添加到项目类路径中,以便能够利用Spring提供的各种功能和服务。在实际开发中,应结合Spring的官方文档和其他参考资料,深入了解并熟练掌握这些库的使用,以充分发挥Spring3.1.1版本的优势。

    Spring3.1.1+Struct+hibernate3.x必须的jar包

    在"Spring3.1.1+Struct+hibernate3.x必须的jar包"中,"hibernate3.x必须的包.rar"可能包含了Hibernate框架所需的各种jar文件,如hibernate-core、hibernate-annotations、hibernate-commons-annotations等。...

Global site tag (gtag.js) - Google Analytics