我正在将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;
}
答案 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的实现(或更好甚至从不)。