2012-03-25 64 views
3

我对一个小项目使用Hibernate和JPA。使用Hibernate 3.6.3和JPA 2.0创建类型化查询时的AbstractMethodError

不知何故试图获得一个键入查询时,所述

java.lang.AbstractMethodError: org.hibernate.ejb.EntityManagerImpl.createQuery(Ljava/lang/String;Ljava/lang/Class;)Ljavax/persistence/TypedQuery 

被抛出; org.hibernate.ejb.EntityManagerImpl来自hibernate-entitymanager-3.3.2.GA.jar。

这是不行的抛出上述异常:

public Account read(Account entity) { 
     EntityManager em = ManagedEntityManagerFactory.getEntityManager(); 

     String jpql = JPQLGenerator.readAccount(); 
     TypedQuery<Account> typedQuery = 
       em.createQuery(jpql, Account.class); 
     typedQuery.setParameter("accountId", entity.getAccountId()); 
     return typedQuery.getSingleResult(); 
    } 

这是正常的,但是:

public Account read(Account entity) { 
    EntityManager em = ManagedEntityManagerFactory.getEntityManager(); 

    String jpql = JPQLGenerator.readAccount(); 

    Query query = 
      em.createQuery(jpql); 
    query.setParameter("accountId", entity.getAccountId()); 
    Account account = null; 
    Object obj = query.getSingleResult(); 
    if(obj instanceof Account) { 
     account = (Account)obj; 
    } 
    return account; 
} 

回答

5

你有Hibernate和JPA版本相当搭配。在主题行中提到Hibernate版本3.6.3和JPA版本2.0。根据正文文本EntityManagerImpl是版本3.3.2.GA.这种与版本相关的问题会导致您的问题。

TypedQuery是在JPA 2.0中引入的,Hibernate自3.5.X开始实现此规范。现在你有EntityManager接口

<T> TypedQuery<T> createQuery(CriteriaQuery<T> criteriaQuery) 

但是实际的实现并没有实现这样的方法。这就是为什么你会得到AbstractMethodError。你的第二个查询工作正常,因为它使用JPA 1.0构造和它的一个实现(3.3.2.GA.)。只需使用Hibernate 3.6.3版本的实现(甚至更好)。

+0

不能在评论中提供enouth信息,所以我给出了另一个答案。 – m3th0dman 2012-03-25 15:07:19

+0

我已经把hibernate-entitymanager-3.6.3.jar,但现在我得到另一个异常(更早):java.lang.ExceptionInInitializerError引起:javax.persistence.PersistenceException:无效的persistence.xml。 解析XML时出错(第1行:列-1):cvc-elt.1:找不到元素'persistence'的声明。 Persistence.xml看起来像loke: – m3th0dman 2012-03-25 15:14:21

+0

我无法发布其他答案(没有足够的声望),但我没有足够的空间来发布persistence.xml文件,因此我会放置一个链接:http://dl.dropbox.com/u/ 27959140/persistence.xml – m3th0dman 2012-03-25 15:19:35

相关问题