将Spring 3.x和Hibernate 3.x升级到Spring Platform 1.0.1(Spring + hibernate 4.x)

我最近自愿将我们的最新项目升级到最新版本的Spring Platform。 Spring Platform为您提供的是整个Spring框架库集中的依赖项和插件管理。

由于我们落后了一点,升级确实增加了一些乐趣。 这是我遇到的事情:



Maven:

我们的pom文件仍在引用:
hibernate.jar
ehcache.jar

这些伪像不会在最新版本上退出,因此请使用hibernate-core.jarehcache-core.jar替换它们。

我们还仍然使用休眠工具+ maven run插件对我们的db对象进行反向工程。 我需要更新为候选版本:

<hibernate-tools .version="">4.3.1.CR1</hibernate-tools>

休眠:

代码:“ Hibernate.createBlob”…不再存在

替换为:

private Blob createBlob(final byte[] bytes) {
return NonContextualLobCreator.INSTANCE.wrap(NonContextualLobCreator.INSTANCE.createBlob(bytes));
}

在HibernateTemplate上,返回类型现在为List; 不是元素…因此需要为要返回的列表添加演员表。

import org.hibernate.classic.Session;

替换为:

import org.hibernate.Session;

逆向工程师的工作方式略有不同……
将Long分配给数字…
添加:

<type-mapping>
 <sql-type jdbc-type="NUMERIC" precision="4" hibernate-type="java.lang.Integer" />
 <sql-type jdbc-type="NUMERIC" precision="6" hibernate-type="java.lang.Integer" />
 <sql-type jdbc-type="NUMERIC" precision="8" hibernate-type="java.lang.Integer" />
 <sql-type jdbc-type="NUMERIC" precision="10" hibernate-type="java.lang.Long" />
 <sql-type jdbc-type="DECIMAL" precision='4' scale='0' hibernate-type="java.lang.Integer" not-null="true"/>
 <sql-type jdbc-type="DECIMAL" precision='6' scale='0' hibernate-type="java.lang.Integer" not-null="true"/>
 <sql-type jdbc-type="DATE" hibernate-type="java.util.Date"/>
</type-mapping>

可能的错误:

  • 原因:org.hibernate.service.UnknownUnwrapTypeException:无法解包为请求的类型[javax.sql.DataSource]

为c3p0添加依赖项:

<dependency>
 <groupid>org.hibernate</groupId>
 <artifactid>hibernate-c3p0</artifactId>
 <version>${hibernate.version}</version>
</dependency>

并在cfg.xml中为其配置设置:

<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.max_size">20</property>
<property name="hibernate.c3p0.timeout">300</property>
<property name="hibernate.c3p0.max_statements">50</property>
<property name="hibernate.c3p0.idle_test_period">3000</property>
  • 引起原因:java.lang.ClassNotFoundException:org.hibernate.engine.FilterDefinition

可能仍在某处使用对hibernate3 factory / bean的引用,更改为hibernate4:

org.springframework.orm.hibernate3.LocalSessionFactoryBean
org.springframework.orm.hibernate3.HibernateTransactionManager
  • 由以下原因引起:java.lang.ClassNotFoundException:无法加载请求的类:org.hibernate.hql.classic.ClassicQueryTranslatorFactory新API进行了细微更改,因此可以通过将属性值替换为:
org.hibernate.hql.internal .classic.ClassicQueryTranslatorFactory.

弹簧:

令人惊讶的是,我们的某些应用程序上下文文件仍然引用了Spring DTD……替换为XSD:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">

在为c3p0添加的Spring配置中:

<prop key="hibernate.c3p0.min_size">5</prop>
<prop key="hibernate.c3p0.max_size">20</prop>
<prop key="hibernate.c3p0.timeout">300</prop>
<prop key="hibernate.c3p0.max_statements">50</prop>
<prop key="hibernate.c3p0.idle_test_period">3000</prop>

Spring删除了“ local” =:因此只需将其更改为“ ref” =

Spring HibernateDaoSupport不再具有:“ releaseSession(session);”,这是一件好事,因此被迫更新代码以在事务中工作。

可能的错误:

  • 如果没有活动事务,则getFlushMode无效; 嵌套的异常是org.hibernate.HibernateException:如果没有活动的事务,则getFlushMode无效

从休眠属性中删除:

<prop key="hibernate.current_session_context_class">thread</prop>

为“当前” Session的范围提供自定义策略。 有关内置策略的更多信息请参见第2.5节“上下文会话”

  • org.springframework.dao.InvalidDataAccessApiUsageException:只读模式(FlushMode.MANUAL)中不允许写操作:将Session变为FlushMode.COMMIT / AUTO或从事务定义中删除“ readOnly”标记。

另一种选择是:

<bean id ="productHibernateTemplate" class="org.springframework.orm.hibernate4.HibernateTemplate">
<property name="sessionFactory" ref="productSessionFactory"/>
<property name="checkWriteOperations" value="false"/>
</bean>
  • java.lang.NoClassDefFoundError:javax / servlet / SessionCookieConfig

Servlet版本更新:

<dependency>
 <groupid>javax.servlet</groupId>
 <artifactid>servlet-api</artifactId>
 <version>3.0.1</version>
</dependency>
  • 然后在weblogic javassist上进行部署:$$ _ javassist_无法转换为javassist.util.proxy.Proxy

这里的问题是有不同版本的javassist被带入了耳朵。 我从所有pom中删除了所有引用,以便从Spring / Hibernate中获取正确的版本…

然后将weblogic配置为首选我们的版本:

<?xml version="1.0" encoding="UTF-8"?>
<weblogic-application>
 <application-param>
  <param-name>webapp.encoding.default</param-name>
  <param-value>UTF-8</param-value>
 </application-param>
 
<prefer-application-packages>
<package-name>javax.jws.*</package-name>
<package-name>org.apache.xerces.*</package-name>
<package-name>org.apache.xalan.*</package-name>
<package-name>org.apache.commons.net.*</package-name>
<package-name>org.joda.*</package-name>
<package-name>javassist.*</package-name>
</prefer-application-packages>
</weblogic-application>

翻译自: https://www.javacodegeeks.com/2014/08/upgrading-spring-3-x-and-hibernate-3-x-to-spring-platform-1-0-1-spring-hibernate-4-x.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值