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