使用Hibernate 3.6.3和JPA 2.0创建类型化查询时发生AbstractMethodError

使用Hibernate 3.6.3和JPA 2.0创建类型化查询时发生AbstractMethodError,hibernate,jpa,jpa-2.0,entitymanager,Hibernate,Jpa,Jpa 2.0,Entitymanager,我正在为一个小项目使用Hibernate和JPA 在尝试获取类型化查询时 java.lang.AbstractMethodError: org.hibernate.ejb.EntityManagerImpl.createQuery(Ljava/lang/String;Ljava/lang/Class;)Ljavax/persistence/TypedQuery 被抛出;org.hibernate.ejb.EntityManagerImpl来自hibernate-entitymanager-3.

我正在为一个小项目使用Hibernate和JPA

在尝试获取类型化查询时

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();
    }

您有相当多的Hibernate和JPA版本的混合。在主题行中,您提到了Hibernate版本3.6.3和JPA版本2.0。根据正文,EntityManagerImpl是版本3.3.2.GA。这个版本的网格会导致您的问题

是在JPA2.0中引入的,Hibernate从3.5.X开始实现该规范。现在您有了与的接口

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

但实际实现并没有实现这种方法。这就是为什么你会犯错误。您的第二个查询工作正常,因为它使用JPA1.0构造和它的一个实现(3.3.2.GA)。只需使用Hibernate版本3.6.3中的实现(或者更好的是从不使用)。

无法在注释中放置enouth信息,所以我给出了另一个答案。我放置了Hibernate-entitymanager-3.6.3.jar,但现在我得到了另一个例外(早期):java.lang.ExceptionInInitializerError由以下原因引起:javax.persistence.PersistenceException:无效的persistence.xml。解析xml时出错(第1行:第1列):cvc elt.1:找不到元素“persistence”的声明。persistence.xml看起来像loke:我无法发布另一个答案(信誉不够)我没有足够的空间发布persistence.xml文件,因此我将放置一个链接:您的persistence.xml至少有以下问题:1)persistence元素缺少xmlns和version属性,2)connection.pool_size应该有value属性,而元素没有值,3)您没有定义persistence provider,您需要这样的东西:org.hibernate.ejb.HibernatePersistence(取决于您想要使用哪个)。从中可以找到示例persistence.xml,因为您的原始问题得到了回答,您可以接受此答案并为下一个问题创建新问题。然后,您的类路径中仍然存在垃圾,因为从代码中可以看到该方法:
<T> TypedQuery<T> createQuery(CriteriaQuery<T> criteriaQuery)