2010-03-29 36 views
8

Escribí un método EJB sin estado que permite obtener una entidad en modo "solo lectura".Separar una entidad de un contexto de persistencia JPA (JPA 2.0/Hibernate/EJB 3/J2EE 6)

La forma de hacerlo es obtener la entidad con EntityManager y luego separarla (utilizando el JPA 2.0 EntityManager).

Mi código es el siguiente:

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

Conseguir la entidad trabaja muy bien, pero la llamada al método detach devuelve el siguiente error:

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) 

no puedo conseguir más información y no entiendo cuál es el problema ...

¿Alguien podría ayudar?

Respuesta

7

Supongo que está utilizando JPA 2.0 con la versión incorrecta de Hibernate, que no implementa la especificación JPA 2.0. La excepción dice que el EntityManagerImpl no tiene el método requerido.

Sugiero actualizar hibernate a 3.5, que es una implementación de JPA 2.0.

+0

¡Gracias! Acabo de actualizar mis JAR de Hibernate a 3.5.0 CR2 y funciona muy bien. – Julien

+0

¿La operación de separación es recursiva (es decir, en cascada)? –

+0

@Guido - sí, si tiene cascadeType = DETACH – Bozho

1

Puede separar todas las entidades con claro pero separando solo una entidad no está en el JPA 2.0. http://java.sun.com/javaee/5/docs/api/javax/persistence/EntityManager.html

Probablemente tenían hibernación impl en su trayectoria de la estructura, y otra implementación del servidor de aplicaciones (EclipseLink? O de hibernación versión antigua) ...

El entityManager.detach(...) está en hibernación, pero no en la APP por lo que necesita el hibernate impl en su servidor de aplicaciones para usar esta función ...

+0

La respuesta de Bozho resolvió mi problema. Separar una sola entidad funciona FINE en JPA 2.0 (J2EE 6) – Julien

+0

Mi error tiene razón, está en la interfaz JPA 2.0 –

Cuestiones relacionadas