/ / Odłącz encję od kontekstu trwałości JPA (JPA 2.0 / Hibernate / EJB 3 / J2EE 6) - hibernacja, jpa, ejb-3.0

Odłącz encję od kontekstu utrwalania JPA (JPA 2.0 / Hibernate / EJB 3 / J2EE 6) - hibernacja, jpa, ejb-3.0

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 № 1

Zakł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 ...