老项目升级:从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包引用情况。

	
		...
		
		
			org.springframework
			spring-struts
			3.0.5.RELEASE
		
		
			org.springframework
			spring-orm
			3.0.5.RELEASE
		
		
		
		
			struts
			struts
			1.2.9
		
		
		
		
			org.hibernate
			hibernate
			3.2.7.ga
		
		
			org.hibernate
			hibernate-annotations
			3.2.0.ga
		
		
		 ...
	

升级后的maven配置如下:

	
		5.1.5.RELEASE
		5.2.18.Final
		3.16
	
	
		...
		
		
			org.springframework
			spring-webmvc
			${springframework.version}
			
				
					org.springframework
					spring-jcl
				
			
		
		
			org.springframework
			spring-orm
			${springframework.version}
		
		
		    org.springframework
		    spring-context-support
		    ${springframework.version}
		
		
		
		
			struts
			struts
			1.2.9
		
		
		
	      
	        org.hibernate  
	        hibernate-core  
	        ${hibernate.version}  
	    
	      
	        org.hibernate  
	        hibernate-ehcache  
	        ${hibernate.version}  
	    
		
		...
	

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.dtd http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd
Hibernate API Hibernate.STRING StandardBasicTypes.STRING
Hibernate API org.hibernate.engine.SessionFactoryImplementor org.hibernate.engine.spi.SessionFactoryImplementor
Hibernate API org.hibernate.engine.SessionImplementor org.hibernate.engine.spi.SessionImplementor
Hibernate API org.hibernate.impl.SessionFactoryImpl org.hibernate.internal.SessionFactoryImpl
Spring API org.springframework.orm.hibernate5.SessionFactoryUtils.getSession(sessionFactory, true) sessionFactory.openSession()
Ehcache API net.sf.ehcache.constructs.web.filter.FilterServletOutputStream
Spring API org.springframework.orm.hibernate3.support.HibernateDaoSupport org.springframework.orm.hibernate5.support.HibernateDaoSupport
Spring API org.springframework.orm.hibernate3.LocalSessionFactoryBean org.springframework.orm.hibernate5.LocalSessionFactoryBean
Hibernate API org.hibernate.collection.PersistentSortedSet org.hibernate.collection.internal.PersistentSortedSet
Hibernate API org.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配置项
Hibernate API session.setFlushMode(FlushMode.NEVER) session.setHibernateFlushMode(FlushMode.MANUAL)
Hibernate API org.hibernate.Query org.hibernate.query.Query
Hibernate API currentSession.get().flush() 删除

还需要修改xml约束

改为


|

你可能感兴趣的:(Hibernate5,struts1,Spring5)