文档章节

spring2.5+hibernate3升级到spring4.3.2+hibernate5.2.2总结

Mr-Bird-Lee
 Mr-Bird-Lee
发布于 2016/09/22 16:41
字数 813
阅读 442
收藏 1

前言:

    最近公司要升级技术架构,需要把老代码的spring2+hibernate3升到最新版本,本以为是简单替换几个jar包依赖的事儿,但结果是一堆冲突产生。于是耐着性子一个一个的解决,鉴于网上很少有详细升级的教程,于是我决定把这次升级中遇到的问题总结下来,以供后人参考。

1.pom.xml文件部分

<!-- spring -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>4.3.2.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>4.3.2.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-beans</artifactId>
      <version>4.3.2.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-tx</artifactId>
      <version>4.3.2.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</artifactId>
      <version>4.3.2.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-orm</artifactId>
      <version>4.3.2.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aspects</artifactId>
      <version>4.3.2.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-test</artifactId>
      <version>4.3.2.RELEASE</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-core</artifactId>
      <version>5.2.2.Final</version>
    </dependency>

2.AnnotationSessionFactoryBean 需要替换成 LocalSessionFactoryBean 

2.1)如果bean的注入是通过代码方式注入的,则需要如下设置:

//此处原先是AnnotationSessionFactoryBean sessionFactoryBean = new //AnnotationSessionFactoryBean(); 

LocalSessionFactoryBean sessionFactoryBean = new LocalSessionFactoryBean();
sessionFactoryBean.setHibernateProperties(hibernateProperties);//hibernate的配置
sessionFactoryBean.setDataSource(dds);//手动设置数据源

//clazzs是所有要扫描的entity类

sessionFactoryBean.setAnnotatedClasses(clazzs); 

// 下边这步问题较多,多是jar包冲突,总是报一些方法找不到,构造函数冲突之类的异常,其实就是jar包冲突了,需要自己利用IDE中的maven依赖工具来排查(如IntelliJ Idea的maven dependency工具),我遇到的是hibernate-annotations这个jar包冲突,系统里原先有个旧版本的,hibernate5.5引用了最新的,两者冲突,需要把旧的exclusion掉,这种错编译时没事儿,运行时异常,需要通过调试,耐心跟踪错误堆栈来排查

sessionFactoryBean.afterPropertiesSet();

sessionFactory = (SessionFactory) sessionFactoryBean.getObject();//获得sessionFactory

2.2)如果bean的注入是通过spring配置文件方式注入的,则直接把AnnotationSessionFactoryBean 类替换成 LocalSessionFactoryBean 即可。

3.hibernateTemplate,HibernateCallback已不再被spring4推荐使用,需要替换成hibernate原生的操作方式

3.1)原先的方式:

hibernateTemplate.execute(new HibernateCallback() {

public Object doInHibernate(Session session) throws HibernateException, SQLException {

            session.connection().setAutoCommit(false);//hibernate5已不支持这样的方式来获取连接

            Transaction trans = session.beginTransaction();

            //do something...

            session.flush();
            session.clear();
            trans.commit();

}

     现在的方式:

Session session = sessionFactory.openSession();
Transaction trans = session.beginTransaction();

//do something

trans.commit();

3.2)原先的方式:

list = (List) hibernateTemplate.execute(new HibernateCallback() {

            Session session = sessionFactory.openSession();

            query.addScalar(scaInfo.getColumnName()); 

            query.setParameter(i, id); 

            return query.list(); 

}

      现在的方式:

Session session = sessionFactory.openSession();
NativeQuery query = session.createNativeQuery(sqlInfo.getSql());

query.addScalar(scaInfo.getColumnName()); 

query.setParameter(i, id); //原先的index是从0开始的,现在从1开始了。。

list = query.list();

4.Hibernate类已不提供类型的常量支持,现在用StandardBasicTypes代替

原先的方式:

query.addScalar("id", Hibernate.LONG); 

现在的方式:

query.addScalar("id", StandardBasicTypes.LONG); 

5.Type的获取方式变了,原先使用TypeFactory.basic获取,现在使用BasicType代替

原先的方式:

Type type = TypeFactory.basic(className);

现在的方式:

BasicType type = new TypeLocatorImpl(new TypeResolver()).basic(className); 

6.SimpleJdbcTemplate 已被删除了

原先的方式:

SimpleJdbcTemplate simpleJdbcTemplate = new SimpleJdbcTemplate(dataSource); 

现在的方式:

NamedParameterJdbcTemplate namedJdbcTemplate = new NamedParameterJdbcTemplate(dataSource); 

7.Configurable 的configure方法的参数变了

原先的方式:

public void configure(Type arg0, Properties props, Dialect arg2) 

现在的方式:

public void configure(Type type, Properties properties, ServiceRegistry serviceRegistry) throws MappingException 

8.IdentifierGenerator的generate方法参数变了

原先的方式:

public Serializable generate(SessionImplementor session, Object arg1) throws HibernateException 

现在的方式:

public Serializable generate(SharedSessionContractImplementor sharedSessionContractImplementor, Object o) throws HibernateException 

 

© 著作权归作者所有

Mr-Bird-Lee
粉丝 1
博文 22
码字总数 33438
作品 0
海淀
程序员
私信 提问
加载中

评论(2)

Mr-Bird-Lee
Mr-Bird-Lee

引用来自“Alber-YG”的评论

您好,你这能不能说的更具体些,尤其是在运行时引起的jar包冲突问题! 您应该留有笔记把,能否发一份我借鉴下.😊
jar包冲突各个项目的mvn依赖不太相同,所以解决的方式也不太相同,但是通过ide自带的mvn依赖管理,然后配合报错的class所在的jar包,基本可以找出具体的问题所在~
Alber-YG
Alber-YG
您好,你这能不能说的更具体些,尤其是在运行时引起的jar包冲突问题! 您应该留有笔记把,能否发一份我借鉴下.😊
笔记89 | CanBus升级程序指南

最近有负责canbus程序项目,现在来总结一下 总的来说升级就是将数据发送给can盒子的一个过程,目前已经有调试好欣扑,比纳瑞,威驰,福嘉太四个公司的升级程序,总结来说就分以下几步: 0,扫...

项勇
2018/08/25
0
0
AEAI WM V1.5.0 升级说明,开源工作管理系统

1.升级说明 本次AEAI WM升级内容主要是针对数通畅联推出AEAI ECP企业云联平台而升级的,其中对AEAI WM的各模块进行扩展,同时增加了移动门户版功能及为AEAI ECP提供数据服务接口。 另外,AEA...

数通畅联
2016/05/17
57
0
AEAI WM V1.5.0 发布,开源工作管理系统

AEAI WM V1.5.0 发布了。 1.升级说明 本次AEAI WM升级内容主要是针对数通畅联推出AEAI ECP企业云联平台而升级的,其中对AEAI WM的各模块进行扩展,同时增加了移动门户版功能及为AEAI ECP提供...

数通畅联
2016/05/17
2.7K
0
Vue 项目升级到 webpack4.x 小纪【附代码】

自 webpack 4.x 发布以来,就独得码农恩宠。我公司的项目是基于 webpack 3.x 版本的 vue 项目, 当时是用 vue-cli 工具构建的项目,项目开发完成后发现打包性能低下,而且项目是多页面的,需...

linghuam
2018/08/15
0
0
Windows 10升级指南:哪个版本最适合你?

微软已经宣布Windows 10将拥有7个不同的版本,而部分用户在选择时可能并不确定哪个版本才是最适合自己的。为了帮助有意升级的用户提前做好选择,科技网站Digital Trends日前就撰文介绍了Win...

nick_zp
2015/08/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

AOP的学习(1)

AOP 理解AOP编程思想(面向方法、面向切面) spring AOP的概念 方面 -- 功能 目标 -- 原有方法 通知 -- 对原有方法增强的方法 连接点 -- 可以用来连接通知的地方(方法) 切入点 -- 将用来插入...

太猪-YJ
24分钟前
2
0
一张图看懂亮度、明度、光度、光亮度、明亮度

亮度、明度、光亮度,Luminance和Brightness、lightness其实都是一个意思,只是起名字太难了。 提出一个颜色模型后,由于明度的取值与别人的不同,为了表示区别所以就另想一个词而已。 因此在...

linsk1998
昨天
3
0
Python应用:python链表示例

前言 python链表应用源码示例,需要用到python os模块方法、函数和类的应用。 首先,先简单的来了解下什么是链表?链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是...

python小白1
昨天
3
0
Source Insight加载源码

Source Insight是一个图形化的源代码查看工具(当然也可以作为编译工具)。如果一个项目的源代码较多,此工具可以很方便地查找到源代码自建的依赖关系。 1.创建工程 下图为Snort源代码的文件...

天王盖地虎626
昨天
3
0
nginx-rtmp-module的缺陷分析(二)

nginx-rtmp-module使用指令push和pull来relay媒体流数据,以便分布式部署服务。 当nginx-rtmp-module作为边缘服务器(一般不会向边缘服务器推流)时,使用pull从源服务器获取媒体流数据,俗称...

YoungSagit
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部