2010-03-29 11 views
8

Ho scritto un metodo EJB stateless che consente di ottenere un'entità in modalità "sola lettura".Scollegare un'entità da un contesto di persistenza JPA (JPA 2.0/Hibernate/EJB 3/J2EE 6)

Il modo per fare ciò è ottenere l'entità con EntityManager e quindi scollegarla (utilizzando EntityManager JPA 2.0).

Il mio codice è il seguente:

@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; 
    } 
} 

Ottenere l'entità funziona bene, ma la chiamata al metodo detach restituisce il seguente errore:

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) 

non posso ottenere maggiori informazioni e non capisco qual è il problema ...

Qualcuno potrebbe aiutare?

risposta

7

Presumo che si stia utilizzando JPA 2.0 con la versione errata di Hibernate, che non implementa la specifica JPA 2.0. L'eccezione indica che lo EntityManagerImpl non ha il metodo richiesto.

Suggerisco di aggiornare Hibernate a 3.5, che è un'implementazione JPA 2.0.

+0

Grazie! Ho appena aggiornato i miei JAR Hibernate a 3.5.0 CR2 e funziona benissimo. – Julien

+0

L'operazione di scollegamento è ricorsiva (vale a dire in cascata)? –

+0

@Guido - sì, se hai cascadeType = DETACH – Bozho

1

È possibile scollegare tutte le entità con chiaro ma scollegare solo un'entità non è in JPA 2.0. http://java.sun.com/javaee/5/docs/api/javax/persistence/EntityManager.html

probabilmente ti avesse hibernate impl nel vostro percorso di generazione, e un altro implementazione sul server di applicazioni (EclipseLink? O vecchia versione di ibernazione) ...

Il entityManager.detach(...) è in Hibernate, ma non in APP quindi è necessario l'impl Hibernate sul server delle applicazioni per utilizzare questa funzione ...

+0

La risposta di Bozho ha risolto il mio problema. Scollega una singola entità funziona FINE in JPA 2.0 (J2EE 6) – Julien

+0

Errore mio hai ragione è nell'interfaccia JPA 2.0 –

Problemi correlati