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

前言:

    最近公司要升级技术架构,需要把老代码的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 

 

转载于:https://my.oschina.net/jumpLee/blog/750275

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值