Napisałem bezpaństwową metodę EJB pozwalającą na uzyskanie encji w trybie „tylko do odczytu”.
Sposobem na to jest uzyskanie encji za pomocą EntityManager, a następnie odłączenie jej (za pomocą JPA 2.0 EntityManager).
Mój kod jest następujący:
@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;
}
}
Uzyskanie bytu działa dobrze, ale połączenie z detach
Metoda zwraca następujący błąd:
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)
Nie mogę uzyskać więcej informacji i nie rozumiem na czym polega problem ...
Czy ktoś mógłby pomóc?
Odpowiedzi:
7 dla odpowiedzi № 1Zakładam, że używasz JPA 2.0 z niepoprawną wersją Hibernacji, która nie implementuje specyfikacji JPA 2.0. Wyjątek mówi, że EntityManagerImpl
nie ma wymaganej metody.
Sugeruję uaktualnienie hibernacji do wersji 3.5, która jest implementacją JPA 2.0.
1 dla odpowiedzi nr 2
Możesz odłączyć wszystkie jednostki za pomocą wyczyszczenia, ale odłączenia tylko jednej jednostki nie ma w JPA 2.0. http://java.sun.com/javaee/5/docs/api/javax/persistence/EntityManager.html
Prawdopodobnie miałeś hibernację w ścieżce kompilacji i kolejną implementację na serwerze aplikacji (EclipseLink? Lub stara wersja hibernacji) ...
The entityManager.detach(...)
jest w trybie hibernacji, ale nie jest w JPA, więc potrzebujesz hibernacji impl na serwerze aplikacji, aby użyć tej funkcji ...