使用Hibernate 3.6.3和JPA 2.0创建类型查询时出现AbstractMethodError错误

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

这样是可以的,但是:

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
你的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(或更好甚至从未使用过)的实现即可。

无法在评论中提供足够的信息,因此我已经给出了另一个答案。 - Random42
我已经放置了hibernate-entitymanager-3.6.3.jar,但现在我遇到另一个异常(之前):java.lang.ExceptionInInitializerError。造成这个异常的原因是:javax.persistence.PersistenceException: Invalid persistence.xml. 错误解析XML(行-1:列-1):cvc-elt.1:找不到元素'persistence'的声明。Persistence.xml看起来像: - Random42
我无法发布另一个答案(声望不够),也没有足够的空间来发布persistence.xml文件,因此我将放置一个链接:http://dl.dropbox.com/u/27959140/persistence.xml - Random42
你的persistence.xml文件至少存在以下问题:1)缺少persistence元素的xmlns和version属性,2).connection.pool_size应该有value属性而不是元素值,3)你没有定义持久性提供程序,你需要像这样的东西:<provider>org.hibernate.ejb.HibernatePersistence</provider>(取决于你想使用哪个)。从http://docs.jboss.org/hibernate/entitymanager/3.5/reference/en/html/configuration.html中可以找到persistence.xml的示例。因为你的原始问题已经得到解答,所以你可以接受这个答案并为下一个问题创建新的问题。 - Mikko Maunu
感谢您的回答。我已经成功使用新的hibernate-entitymanager-3.6.3.jar使测试通过,但是当我尝试获取TypedQuery时它们仍然失败。 - Random42
1
那么你的类路径仍然存在垃圾,因为从代码中可以看出该方法在这里:http://grepcode.com/file/repository.jboss.org/nexus/content/repositories/releases/org.hibernate/hibernate-entitymanager/3.6.3.Final/org/hibernate/ejb/AbstractEntityManagerImpl.java#AbstractEntityManagerImpl.0entityManagerSpecificProperties - Mikko Maunu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接