2010-03-29 8 views
8

Ich habe eine zustandslose EJB-Methode geschrieben, die es ermöglicht, eine Entität in den schreibgeschützten Modus zu versetzen.Trennen einer Entität von einem JPA-Persistenzkontext (JPA 2.0/Hibernate/EJB 3/J2EE 6)

Die Methode besteht darin, die Entity mit dem EntityManager zu holen und sie dann zu lösen (mit dem JPA 2.0 EntityManager).

Mein Code ist folgende:

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

Erste das Unternehmen funktioniert gut, aber der Anruf an die detach Methode gibt die folgenden Fehler:

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) 

ich nicht mehr Informationen erhalten und verstehe nicht, was das Problem ist ...

Konnte jemand helfen?

Antwort

7

Ich nehme an, dass Sie JPA 2.0 mit der falschen Version von Hibernate verwenden, die die JPA 2.0-Spezifikation nicht implementiert. Die Ausnahme besagt, dass EntityManagerImpl nicht über die erforderliche Methode verfügt.

Ich empfehle, Hibernate auf 3.5 zu aktualisieren, was eine JPA 2.0-Implementierung ist.

+0

Vielen Dank! Habe gerade meine Hibernate JARs auf 3.5.0 CR2 aktualisiert und es funktioniert super. – Julien

+0

Ist die Detach-Operation rekursiv (d. H. In Kaskade)? –

+0

@Guido - ja, wenn Sie cascadeType = DETACH haben – Bozho

1

Sie können alle Entitäten mit löschen trennen, aber nur eine Entität ist nicht in der JPA 2.0. http://java.sun.com/javaee/5/docs/api/javax/persistence/EntityManager.html

Sie haben wahrscheinlich impl in Ihrem Build-Pfad Ruhezustand, und eine weitere Implementierung auf dem Anwendungsserver (Eclipse? Oder alt Hibernate Version) ...

Die entityManager.detach(...) ist in den Ruhezustand, aber nicht in JPA, so dass Sie brauchen der Ruhezustand impl auf Ihrem Anwendungsserver, um diese Funktion zu verwenden ...

+0

Die Antwort von Bozho löste mein Problem. Trennen Sie eine einzelne Einheit funktioniert FINE in JPA 2.0 (J2EE 6) – Julien

+0

Mein Fehler, Sie haben Recht, es ist in JPA 2.0-Schnittstelle –

Verwandte Themen