Отсоединить сущность от контекста JPA-персистентности (JPA 2.0 / Hibernate / EJB 3 / J2EE 6) - PullRequest
8 голосов
/ 29 марта 2010

Я написал метод 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 ]

7 голосов
/ 29 марта 2010

Я предполагаю, что вы используете JPA 2.0 с неверной версией Hibernate, которая не реализует спецификацию JPA 2.0. Исключение говорит о том, что EntityManagerImpl не имеет требуемого метода.

Я предлагаю обновить hibernate до 3.5, который является реализацией JPA 2.0.

1 голос
/ 08 апреля 2010

Вы можете отсоединить все сущности с четкой, но отсоединить только одну сущность, не входящую в JPA 2.0. http://java.sun.com/javaee/5/docs/api/javax/persistence/EntityManager.html

Возможно, вы указали hibernate в пути к вашей сборке, а другая реализация на вашем сервере приложений (EclipseLink? Или старая версия hibernate) ...

entityManager.detach(...) находится в Hibernate, но не в JPA, поэтому для использования этой функции вам необходим Hibernate Impl на вашем сервере приложений ...

...