【问题标题】:AbstractMethodError when creating typed query with Hibernate 3.6.3 and JPA 2.0使用 Hibernate 3.6.3 和 JPA 2.0 创建类型化查询时出现 AbstractMethodError
【发布时间】:2012-04-09 06:02:11
【问题描述】:

我在一个小项目中使用 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;
}

【问题讨论】:

    标签: hibernate jpa jpa-2.0 entitymanager


    【解决方案1】:

    您有多种 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 中的实现(或者甚至永远不要)。

    【讨论】:

    • 无法在评论中添加所有信息,所以我给出了另一个答案。
    • 我已经放了 hibernate-entitymanager-3.6.3.jar 但现在我得到了另一个异常(较早):java.lang.ExceptionInInitializerError 原因:javax.persistence.PersistenceException: Invalid persistence.xml。解析 XML 时出错(第 1 行:第 -1 列):cvc-elt.1:找不到元素“持久性”的声明。 Persistence.xml 看起来不错:
    • 我无法发布另一个答案(没有足够的声誉)并且我没有足够的空间来发布 persistence.xml 文件,所以我会放一个链接:dl.dropbox.com/u/27959140/persistence.xml
    • 你的 persistence.xml 至少有这些问题:1)持久性元素中缺少 xmlns 和版本属性,2).connection.pool_size 应该有值属性并且元素没有值,3)你尚未定义持久性提供程序,您需要类似:org.hibernate.ejb.HibernatePersistence (取决于您要使用哪个)。从docs.jboss.org/hibernate/entitymanager/3.5/reference/en/html/… 您可以找到示例 persistence.xml 因为您的原始问题已得到解答,您可以接受此答案并为下一个问题创建新问题。
    • 那么您的类路径中仍然有垃圾,因为从代码中您可以看到该方法存在:grepcode.com/file/repository.jboss.org/nexus/content/…
    猜你喜欢
    • 2015-12-29
    • 1970-01-01
    • 1970-01-01
    • 2019-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-29
    • 1970-01-01
    相关资源
    最近更新 更多