使用Hibernate 3.6.3和JPA 2.0创建类型化查询时的AbstractMethodError [英] AbstractMethodError when creating typed query with Hibernate 3.6.3 and JPA 2.0

查看:176
本文介绍了使用Hibernate 3.6.3和JPA 2.0创建类型化查询时的AbstractMethodError的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我为一个小型项目使用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<帐户> typedQuery =
em.createQuery(jpql,Account.class);
typedQuery.setParameter(accountId,entity.getAccountId());
返回typedQuery.getSingleResult();
}

然而,这是可以的:

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

String jpql = JPQLGenerator.readAccount();

查询查询=
em.createQuery(jpql);
query.setParameter(accountId,entity.getAccountId());
帐户帐户=空;
Object obj = query.getSingleResult();
if(obj instanceof Account){
account =(Account)obj;
}
返回帐户;


解决方案

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版本的实现(甚至更好)。


I'm using Hibernate and JPA for a small project.

Somehow when trying to obtain an typed Query, the

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

is thrown; org.hibernate.ejb.EntityManagerImpl is from hibernate-entitymanager-3.3.2.GA.jar .

This is not okay throwing the above exception:

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

This is okay, however:

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

解决方案

You have quite a mix of Hibernate and JPA versions. In subject line you mention Hibernate version 3.6.3 and JPA version 2.0. According body text EntityManagerImpl is version 3.3.2.GA. This mesh up with versions causes your problem.

TypedQuery was introduced in JPA 2.0 and Hibernate implements this specification since 3.5.X. Now you have EntityManager interface with

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

but actual implementation does not implements such a method. That's why you get AbstractMethodError. Your second query works fine, because it uses JPA 1.0 constructs with one of the it's implementations (3.3.2.GA.) Just use implementation from Hibernate version 3.6.3 (or better even never).

这篇关于使用Hibernate 3.6.3和JPA 2.0创建类型化查询时的AbstractMethodError的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆