Hibernate常見錯誤:java.lang.NoSuchMethodError: org.hibernate.SessionFactory.openSession()Lorg/hibe


hibernate4 與 spring3有點沖突

http://blog.csdn.net/gyflyx/article/details/7632645

 

整合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. New HandlerMethod-based Support Classes For Annotated Controller Processing

4. Consumes and Produces @RequestMapping Conditions

5. Working With URI Template Variables In Controller Methods

6. Validation For @RequestBody Method Arguments  //and so on....

7. Spring MVC 3.1 的annotation可以參看下http://starscream.iteye.com/blog/1098880 

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

下面主要說一下我在升級過程中遇到的一些問題及解決辦法。

l Maven的repository始終無法升級到SpringRC2,可能服務器有問題吧,目前暫時是從官方下載的整個SpringRC2的zip包。版本號是:3.1.0.RC2

l Hibernate可以從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。

l Quartz升級到2.1.1,Ehcache-core升級到2.5.0

l Spring3.1取消了HibernateTemplate,因為Hibernate4的事務管理已經很好了,不用Spring再擴展了。所以以前的Dao需要改寫,直接調用Hibernate 的Session進行持久化。

l Spring的配置:

sessionFactory從org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean換成org.springframework.orm.hibernate4.LocalSessionFactoryBean

l Spring的配置:

<prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>改為

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

EhCacheRegionFactory使用配置:

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

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

l Spring 的配置:Hibernate transactionManager從3改為4,如下:

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

        <property name="sessionFactory" ref="sessionFactory"/>

    </bean>

l Spring @ResponseBody輸出是亂碼的問題:原來使用的是:

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

改為:

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

<property name = "messageConverters">

<list>  

<bean class = "org.springframework.http.converter.StringHttpMessageConverter">  

<property name = "supportedMediaTypes">  

<list>

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

</list>

</property> 

</bean>

<bean class = "org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">  

<property name = "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"方便的多。

l Blob,以前配置:

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

@Lob

@Type(type="blob")

public byte[] getPic() {

return pic;

}

現在改為:

    @Lob

public byte[] getPic() {

return pic;

}

簡單很多。

    

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM