Я записал метод 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)
Я не могу получить больше информации и не понимаю, какова проблема...
Кто-то мог помочь?
Я предполагаю, что вы используете JPA 2.0 с неправильной версией Hibernate, которая не реализует спецификацию JPA 2.0. Исключение сообщает, что EntityManagerImpl
не имеет необходимого метода.
Я предлагаю обновить спящий режим до версии 3.5, которая является реализацией JPA 2.0.
Вы можете отсоединить все объекты с помощью очистки, но отсоединение только одного объекта отсутствует в JPA 2.0. http: // java .sun.com / javaee / 5 / docs / api / javax / persistence / EntityManager.html
Вероятно, в вашем пути сборки был имплантированный спящий режим и другая реализация на вашем сервере приложений (EclipseLink? или старая версия спящего режима). .
entityManager.detach (...)
находится в спящем режиме, но не в JPA, поэтому для использования этой функции вам понадобится имплантация спящего режима на сервере приложений ...