前言:

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

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐