之前的项目是spring2.5+hibernate3+struts2。现在升级为spring4,hibernate4
升级步骤:
一、删除之前的Hibernate,spring的jar包,导入spring-framework-4.0.3.RELEASE-dist.zip的部分jar包,导入hibernate-release-4.3.5.Final.zip->lib->requied下的所有包。
二、修改spring核心配置文件,修改3为4
(1)<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
(2)<bean id="txManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
(3)如果要使用Hibernate的注解,不再使用配置文件,则需修改mappingLocations改成packagesToScan
<property name="mappingLocations">
<list>
<value>classpath:com/xuedou/skyedu/bean/*.hbm.xml</value>
</list>
</property>
改成
<property name="packagesToScan">
<list>
<value>com.xuedou.skyedu.bean</value>
</list>
</property>
三:修改web.xml,增加:
<span style="white-space:pre"> </span><filter>
<filter-name>openSessionInViewFilter</filter-name>
<filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class>
<!-- singleSession默认为true,若设为false则等于没用OpenSessionInView,默认可不写-->
<init-param>
<param-name>singleSession</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>openSessionInViewFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
如果继续使用Hibernate的实体映射文件hbm.xml 则需改成(因为在3.6版本后,必须修改):
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
遇到的异常:
异常一:Caused by: java.lang.NoSuchMethodError: javax.persistence.OneToMany.orphanRemoval()Z
问题原因:是因为Hibernate3.5之前,持久化包是ejb3-persistence.jar,包含了javax.persistence.OneToMany,而hibernate3.5之后用的持久化包是hibernate-jpa-2.x.jar。有人说删掉javaee.jar中的persistence,这是不可取的,删除这个没用,关键是项目中引入的jar包与之冲突。
解决办法:两个jar包不能同时存在,删除ejb3-persistence.jar。
最后一定要project->clear重新编译,不然还是报错,找了两天的错重新编译就好了,郁闷!