`
fulerbakesi
  • 浏览: 560644 次
文章分类
社区版块
存档分类
最新评论

hibernate4 与 spring3有点冲突

 
阅读更多

整合NoSuchMethodError错误 and 升级Spring3.1RC2 和Hibernate4.0.0CR7遇到的一些问题及解决

2012-02-20 10:33:28|分类: 编程_SSH |字号订阅

我使用的是hibernate4和spring3,然后报的错误是
java.lang.NoSuchMethodError: org.hibernate.SessionFactory.openSession()Lorg/hibernate/classic/Session;
at org.springframework.orm.hibernate3.SessionFactoryUtils.doGetSession(SessionFactoryUtils.java:324)
at org.springframework.orm.hibernate3.SessionFactoryUtils.getSession(SessionFactoryUtils.java:235)
at org.springframework.orm.hibernate3.HibernateTemplate.getSession(HibernateTemplate.java:457)
at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:393)
at org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374)
at org.springframework.orm.hibernate3.HibernateTemplate.get(HibernateTemplate.java:512)
at org.springframework.orm.hibernate3.HibernateTemplate.get(HibernateTemplate.java:506)
at general.dao.impl.UserDaoHibernate.get(UserDaoHibernate.java:35)
at general.dao.impl.UserDaoHibernate.delete(UserDaoHibernate.java:17)
at hibernate.UserDaoHibernateTest.testDeleteUser(UserDaoHibernateTest.java:41)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:46)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

竟然是找不到方法,而我肯定导入了hibernate的jar包了,在网上搜索相关的文章,有人说这是在整合ssh时常出现的错误,主要指版本间的不兼容,我想这两个框架我都使用的是最新版本啊,怎么会不兼容呢。然后去spring的jar包里面看了一下才知道系统默认的使用的是.hibernate3.SessionFactoryUtils.doGetSessio,而我使用的是hibernate4,那么原因肯定就在这里了,但是为什么在相同路径下就有.hibernate4.SessionFactoryUtils.doGetSessio这个为什么不调用呢?


上网查了一下,主要原因是spring认为hibernate4的代码写的足够好了,不用自己再写一个支持类了。所以就建议使用hibernate4的hibernateDAO了。下面一篇文章不错。学习之。

升级Spring3.1RC2和Hibernate4.0.0CR7遇到的一些问题及解决

Spring3.1RC2支持

1.Quartz2

2.Hibernate4,

3.NewHandlerMethod-basedSupportClassesForAnnotatedControllerProcessing

4.ConsumesandProduces@RequestMappingConditions

5.WorkingWithURITemplateVariablesInControllerMethods

6.ValidationFor@RequestBodyMethodArguments//andsoon....

7.SpringMVC3.1的annotation可以参看下http://starscream.iteye.com/blog/1098880

Hibernate4可以查看http://community.jboss.org/wiki/HibernateCoreMigrationGuide40

下面主要说一下我在升级过程中遇到的一些问题及解决办法。

lMaven的repository始终无法升级到SpringRC2,可能服务器有问题吧,目前暂时是从官方下载的整个SpringRC2的zip包。版本号是:3.1.0.RC2

lHibernate可以从repository中升级到4.0.0.CR7,新增的依赖包有jandex-1.0.3.Final.jar,jboss-logging-3.1.0.CR2.jar,jboss-transaction-api_1.1_spec-1.0.0.Final.jar。

lQuartz升级到2.1.1,Ehcache-core升级到2.5.0

lSpring3.1取消了HibernateTemplate,因为Hibernate4的事务管理已经很好了,不用Spring再扩展了。所以以前的Dao需要改写,直接调用Hibernate的Session进行持久化。

lSpring的配置:

sessionFactoryorg.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean换成org.springframework.orm.hibernate4.LocalSessionFactoryBean

lSpring的配置:

<propkey="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>改为

<propkey="hibernate.cache.provider_class">net.sf.ehcache.hibernate.EhCacheProvider</prop>

EhCacheRegionFactory使用配置:

<propkey="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</prop>

l使用Hibernate所有的openSession()改为getCurrentSession()

lSpring的配置:HibernatetransactionManager从3改为4,如下:

<beanid="txManager"class="org.springframework.orm.hibernate4.HibernateTransactionManager">

<propertyname="sessionFactory"ref="sessionFactory"/>

</bean>

lSpring@ResponseBody输出是乱码的问题:原来使用的是:

<beanclass="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">

改为:

<beanclass="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">

<propertyname="messageConverters">

<list>

<beanclass="org.springframework.http.converter.StringHttpMessageConverter">

<propertyname="supportedMediaTypes">

<list>

<value>text/plain;charset=UTF-8</value>

</list>

</property>

</bean>

<beanclass="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">

<propertyname="supportedMediaTypes">

<list>

<value>text/plain;charset=UTF-8</value>

<value>application/json;charset=UTF-8</value>

</list>

</property>

</bean>

</list>

</property>

这样比每个Controller都加上@RequestMapping(value="/showLeft",method=RequestMethod.GET)
produces="text/plain;charset=utf-8"方便的多。

lBlob,以前配置:

@TypeDefs({@TypeDef(name="clob",typeClass=ClobStringType.class),@TypeDef(name="blob",typeClass=BlobByteArrayType.class)})

@Lob

@Type(type="blob")

publicbyte[]getPic(){

returnpic;

}

现在改为:

@Lob

publicbyte[]getPic(){

returnpic;

}

简单很多。


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics