m3t*_*man 3 hibernate jpa entitymanager jpa-2.0
我正在将Hibernate和JPA用于一个小项目.
不知何故,当试图获得一个类型化的查询时,
java.lang.AbstractMethodError: org.hibernate.ejb.EntityManagerImpl.createQuery(Ljava/lang/String;Ljava/lang/Class;)Ljavax/persistence/TypedQuery
Run Code Online (Sandbox Code Playgroud)
被抛出; 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();
}
Run Code Online (Sandbox Code Playgroud)
但是这没关系:
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;
}
Run Code Online (Sandbox Code Playgroud)
你有很多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)
Run Code Online (Sandbox Code Playgroud)
但实际的实现并没有实现这样的方法.这就是你得到AbstractMethodError的原因.你的第二个查询工作正常,因为它使用JPA 1.0构造与其中一个实现(3.3.2.GA.)只使用Hibernate版本3.6.3的实现(或更好甚至从不).
| 归档时间: |
|
| 查看次数: |
5270 次 |
| 最近记录: |