【问题标题】:Detach an entity from a JPA persistence context (JPA 2.0 / Hibernate / EJB 3 / J2EE 6)从 JPA 持久性上下文中分离实体(JPA 2.0 / Hibernate / EJB 3 / J2EE 6)
【发布时间】:2011-02-02 02:07:16
【问题描述】:

我编写了一个无状态 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)

我无法获得更多信息,也不明白问题出在哪里......

有人可以帮忙吗?

【问题讨论】:

    标签: hibernate jpa ejb-3.0


    【解决方案1】:

    我假设您使用 JPA 2.0 和不正确的 Hibernate 版本,它没有实现 JPA 2.0 规范。异常告诉EntityManagerImpl 没有所需的方法。

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

    【讨论】:

    • 谢谢!刚刚将我的 Hibernate JAR 更新到 3.5.0 CR2,效果很好。
    • 分离操作是否递归(即级联)?
    • @Guido - 是的,如果你有 cascadeType=DETACH
    【解决方案2】:

    您可以使用 clear 分离所有实体,但仅分离一个实体不在 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 才能使用此功能...

    【讨论】:

    • 博卓的回答解决了我的问题。在 JPA 2.0 (J2EE 6) 中分离单个实体可以正常工作
    猜你喜欢
    • 2010-09-07
    • 2017-10-21
    • 1970-01-01
    • 2011-09-22
    • 2013-06-26
    • 1970-01-01
    • 2018-01-05
    • 2011-01-27
    相关资源
    最近更新 更多