老项目升级:从Spring3.0.5+Struts1.2.9+Hibernate3.2.7升到Spring5.1.5+Struts1.2.9+Hiberna5.2.18

版本管理:maven
以下介绍需要重点关注的点

一、Spring

1、spring-struts.3.0.5包是spring为struts1写的整合插件,此插件支持到struts1 EOL(end of life)的时候就没有了后续版本。升级到Spring5后我们采用了移植spring-struts插件源码的办法来解决这种尴尬。
2、修改spring配置文件的约束头
3、修改集成第三方组件(如quartz、jackson、hibernate等)的注入bean、入口类

二、必须升级的第三方组件:

1、jackson从1.8.1升级到2.9.7:jackson从1升到2后包名发生了变化,api变化也较大。但总能找到其替代api
2、quartz从1.8.5升级到2.3.0: quartz1升级2后api变化较大,部分删掉启用的api源码注释中没有link,需阅读官方文档获取信息
3、poi升级到3.16,历史版本有XXE漏洞。poi的api变化可以通过阅读源码来找出,源码注释较为规范
4、ehcache从1.2.3升级到2.10.3

三、Hibernate

Hibernate的变化比较大,主要是API的变化。部分缺失的API搜遍了国内外搜索引擎、大拿博客和知名论坛都找不到一个合适的替代方案。对于一个深度依赖ORM的老项目,平滑移植的想法从一萌生开始就断念了,只能被人逼着硬着头皮搞。
纵观Hibernate3、4、5、6。 其设计标准逐渐向Jpa靠拢,API也是这样。加上springBoot项目的火爆干扰,Spring社区也不会给出Spring5+Hibernate5的老项目升级方案。所幸的事这事总算过去了,现在回头来发发牢骚。
升级步骤:
1、修改hbm映射文件,dtd约束、主键生成策略等。需要注意blob,clob等字段的类型声明,org.springframework.orm.hibernate3.support.BlobByteArrayType和org.springframework.orm.hibernate3.support.ClobStringType在spring5中已被删掉
2、修改获取session的配置项和代码,修改通过session获取connection的方式等
3、元数据的获取方式已发生变化,org.hibernate.cfg.Configuration.getClassMapping(String)已删除。
4、Hibernate5.3+版本的hibernate对Hql占位符的使用有严格要求
5、Hibernate5.2+版本之后createCriteria()、createSQLCriteria()方法均已过时,推荐使用JPA标准API方式
6、修改和spring的集成配置项
7、ehcache升级2.10.3API变化较大,前期为了启动测试关闭了Hibernate二级缓存
8、修改其它变化了的API

四、JDK1.8+

Spring5要求使用JDK1.8+编译

升级之前项目对ssh包引用情况。

	<dependencies>
		...
		<!-- spring start -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-struts</artifactId>
			<version>3.0.5.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-orm</artifactId>
			<version>3.0.5.RELEASE</version>
		</dependency>
		<!-- spring end -->
		<!-- struts start -->
		<dependency>
			<groupId>struts</groupId>
			<artifactId>struts</artifactId>
			<version>1.2.9</version>
		</dependency>
		<!-- struts end -->
		<!-- hibernate start -->
		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate</artifactId>
			<version>3.2.7.ga</version>
		</dependency>
		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-annotations</artifactId>
			<version>3.2.0.ga</version>
		</dependency>
		<!-- hibernate end -->
		 ...
	</dependencies>

升级后的maven配置如下:

	<properties>
		<springframework.version>5.1.5.RELEASE</springframework.version>
		<hibernate.version>5.2.18.Final</hibernate.version>
		<poi.version>3.16</poi.version>
	</properties>
	<dependencies>
		...
		<!-- spring start -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>${springframework.version}</version>
			<exclusions>
				<exclusion>
					<groupId>org.springframework</groupId>
					<artifactId>spring-jcl</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-orm</artifactId>
			<version>${springframework.version}</version>
		</dependency>
		<dependency>
		    <groupId>org.springframework</groupId>
		    <artifactId>spring-context-support</artifactId>
		    <version>${springframework.version}</version>
		</dependency>
		<!-- spring end -->
		<!-- struts start -->
		<dependency>
			<groupId>struts</groupId>
			<artifactId>struts</artifactId>
			<version>1.2.9</version>
		</dependency>
		<!-- struts end -->
		<!-- hibernate start -->
	    <dependency>  
	        <groupId>org.hibernate</groupId>  
	        <artifactId>hibernate-core</artifactId>  
	        <version>${hibernate.version}</version>  
	    </dependency>
	    <dependency>  
	        <groupId>org.hibernate</groupId>  
	        <artifactId>hibernate-ehcache</artifactId>  
	        <version>${hibernate.version}</version>  
	    </dependency>
		<!-- hibernate end -->
		...
	</dependencies>

spring-jcl

spring-jcl是对common-logging的封装,包名和common-logging一致,common-logging的部分api在spring-jcl不存在,使用时会产生冲突。所以spring-webmvc包中排除了对spring-jcl的依赖传递

部分修改项记录

需改项修改前修改后
Hibernate dtd约束http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtdhttp://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd
Hibernate APIHibernate.STRINGStandardBasicTypes.STRING
Hibernate APIorg.hibernate.engine.SessionFactoryImplementororg.hibernate.engine.spi.SessionFactoryImplementor
Hibernate APIorg.hibernate.engine.SessionImplementororg.hibernate.engine.spi.SessionImplementor
Hibernate APIorg.hibernate.impl.SessionFactoryImplorg.hibernate.internal.SessionFactoryImpl
Spring APIorg.springframework.orm.hibernate5.SessionFactoryUtils.getSession(sessionFactory, true)sessionFactory.openSession()
Ehcache APInet.sf.ehcache.constructs.web.filter.FilterServletOutputStream
Spring APIorg.springframework.orm.hibernate3.support.HibernateDaoSupportorg.springframework.orm.hibernate5.support.HibernateDaoSupport
Spring APIorg.springframework.orm.hibernate3.LocalSessionFactoryBeanorg.springframework.orm.hibernate5.LocalSessionFactoryBean
Hibernate APIorg.hibernate.collection.PersistentSortedSetorg.hibernate.collection.internal.PersistentSortedSet
Hibernate APIorg.hibernate.Session.connection()原API已删除,项目改用org.springframework.orm.hibernate5.SessionFactoryUtils.getDataSource(sessionFactory()).getConnection()
或者 org.hibernate.engine.spi.SessionImplementor sessionImplementor = (org.hibernate.engine.spi.SessionImplementor) sessionFactory.getCurrentSession(); Connection conn = sessionImplementor.getJdbcConnectionAccess().obtainConnection();
此处需要特别注意,原来通过org.hibernate.Session获取的connection连接是可以通过session连接的关闭而关闭的,不需要特别考虑connection连接的关闭问题,改为以上2替代方案后connection连接需要显式关闭,否则会有连接泄露问题
spring配置项<ref local><ref bean>
Hibernate APIsession.setFlushMode(FlushMode.NEVER)session.setHibernateFlushMode(FlushMode.MANUAL)
Hibernate APIorg.hibernate.Queryorg.hibernate.query.Query
Hibernate APIcurrentSession.get().flush()删除

还需要修改xml约束
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
改为

<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns="http://www.springframework.org/schema/beans"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd">
</beans>|
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值