2011-08-09 21 views
3

我的應用程序中有一些實現JPA 2.0的問題。我正在使用Criteria查詢,我需要從EntityManager中獲取會話。我按照以下方式(根據this) Session ses = entityManager.unwrap(Session.class);EntityManager.unwrap()拋出java.lang.AbstractMethodError

在Tomcat 7.0.8上運行後,我得到如下:

Struts has detected an unhandled exception: 
# Messages:  org.hibernate.ejb.EntityManagerImpl.unwrap(Ljava/lang/Class;)Ljava/lang/Object; 

Stacktraces 
java.lang.reflect.InvocationTargetException 
java.lang.AbstractMethodError: org.hibernate.ejb.EntityManagerImpl.unwrap(Ljava/lang/Class;)Ljava/lang/Object; sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 

而且我引用下面的Hibernate相關的依賴性(這裏我懷疑問題):

hibernate-3.2.5.ga.jar 
hibernate-annotations-3.4.0.GA.jar 
hibernate-commons-annotations-3.1.0.GA.jar 
hibernate-core-3.3.0.GA.jar 
hibernate-entitymanager-3.4.0.GA.jar 
hibernate-jpa-2.0-api-1.0.0.Final.jar 

對此有何想法?

回答

4

Hibernate 3.4.x不符合JPA-2標準。 JPA 2 was first supported in Hibernate Entitymanager 3.5.0

您正在獲取的錯誤意味着ClassLoader找不到您正在訪問的接口方法的實現方法,如果底層實現僅符合JPA-1,這是非常有意義的,因爲解包已添加到JPA中2.

+1

解決了它!從hibernate.org下載最新的hibernate jars。另外,我在我的classpath中有一個ejb3-persistence.jar,它具有相同的包名稱,並且在構建路徑順序中的hibernate-jpa-2.0 jar之前。該jar沒有實現JPA 2.0規範。 –

+0

@ariel然後你應該[接受我的回答](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work) –

0

我在最新版本的OpenEJB(4.6.0)上使用舊版本的Hibernate(3.3.0)。我的解決方案是:

EntityManagerImpl entityManager = (EntityManagerImpl)em.getDelegate(); 
Session session = entityManager.getSession(); 
相關問題