2010-03-29 9 views
8

Napisałem bezstanową metodę EJB pozwalającą uzyskać encję w trybie "tylko do odczytu".Odłączanie encji od kontekstu utrwalania JPA (JPA 2.0/Hibernate/EJB 3/J2EE 6)

Sposób wykonania tej czynności polega na pobraniu encji za pomocą EntityManager, a następnie jej odłączeniu (przy użyciu menedżera 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; 
    } 
} 

Pierwsze jednostka działa prawidłowo, ale wywołanie metody detach 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ś może pomóc?

Odpowiedz

7

Zakładam, że używasz JPA 2.0 z niepoprawną wersją Hibernate, która nie implementuje specyfikacji JPA 2.0. Wyjątek mówi, że EntityManagerImpl nie ma wymaganej metody.

Sugeruję aktualizację hibernacji do wersji 3.5, co jest implementacją JPA 2.0.

+0

Dzięki! Właśnie zaktualizowałem moje słoje Hibernate do 3.5.0 CR2 i to działa wspaniale. – Julien

+0

Czy operacja odłączania jest rekursywna (to jest kaskadowo)? –

+0

@Guido - tak, jeśli masz cascadeType = DETACH – Bozho

1

Można odłączyć wszystkie elementy z wyraźnym, ale odłączenie tylko jeden podmiot nie jest w JPA 2.0. http://java.sun.com/javaee/5/docs/api/javax/persistence/EntityManager.html

Prawdopodobnie miał hibernacji impl na swojej drodze kompilacji, a kolejne wdrożenie na serwerze aplikacji (EclipseLink? Czy stara wersja hibernacji) ...

entityManager.detach(...) jest w Hibernate JPA, ale nie w tak trzeba hibernate wpływa na serwer aplikacji, aby użyć tej funkcji ...

+0

Odpowiedź Bozho rozwiązała mój problem. Odłącz pojedynczy obiekt działa FINE w JPA 2.0 (J2EE 6) – Julien

+0

Mój błąd, masz rację, jest w interfejsie JPA 2.0 –