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

时间:2012-03-25 12:41:59

标签: 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.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;
}

1 个答案:

答案 0 :(得分: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的实现(或更好甚至从不)。