AbstractMethodError при создании типизированного запроса в Hibernate 3.6.3 и JPA 2.0 - PullRequest
3 голосов
/ 25 марта 2012

Я использую 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 Ответ

5 голосов
/ 25 марта 2012

У вас довольно много версий 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 (или лучше даже никогда).

...