从JPA持久化上下文中分离实体(JPA 2.0 / Hibernate / EJB 3 / J2EE 6)

时间:2010-03-29 14:50:15

标签: hibernate jpa ejb-3.0

我编写了一个无状态EJB方法,允许以“只读”模式获取实体。

执行此操作的方法是使用EntityManager获取实体,然后将其分离(使用JPA 2.0 EntityManager)。

我的代码如下:

@PersistenceContext
private EntityManager entityManager;

public T getEntity(int entityId, Class<T> specificClass, boolean readOnly) throws Exception{
  try{
    T entity = (T)entityManager.find(specificClass, entityId);
    if (readOnly){
      entityManager.detach(entity);
    }
    return entity;
  }catch (Exception e){
    logger.error("", e);
    throw e; 
  }
}  

让实体正常工作,但对detach方法的调用会返回以下错误:

GRAVE: javax.ejb.EJBException
    at ...
Caused by: java.lang.AbstractMethodError: org.hibernate.ejb.EntityManagerImpl.detach(Ljava/lang/Object;)V
    at com.sun.enterprise.container.common.impl.EntityManagerWrapper.detach(EntityManagerWrapper.java:973)
    at com.mycomp.dal.MyEJB.getEntity(MyEJB.java:37)

我无法获得更多信息,也无法理解问题所在......

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:7)

我假设你正在使用JPA 2.0和不正确版本的Hibernate,它没有实现JPA 2.0规范。该例外表明EntityManagerImpl没有所需的方法。

我建议将hibernate升级到3.5,这是一个JPA 2.0实现。

答案 1 :(得分:1)

您可以清楚地分离所有实体,但只分离一个实体不在JPA 2.0中。 http://java.sun.com/javaee/5/docs/api/javax/persistence/EntityManager.html

你的构建路径中可能有hibernate impl,你的应用服务器上有另一个实现(EclipseLink?或旧的hibernate版本)......

entityManager.detach(...)在Hibernate中但在JPA中没有,所以你需要在你的应用服务器上使用hibernate impl才能使用这个函数......