2010-03-29 16 views
8

से एक इकाई को अलग करें मैंने एक स्टेटलेस ईजेबी विधि लिखा है जो "केवल-पढ़ने" मोड में एक इकाई प्राप्त करने की इजाजत देता है।जेपीए दृढ़ता संदर्भ (जेपीए 2.0/हाइबरनेट/ईजेबी 3/जे 2 ईई 6)

ऐसा करने का तरीका EntityManager के साथ इकाई को प्राप्त करना है और फिर इसे अलग करना (जेपीए 2.0 EntityManager का उपयोग करके)।

मेरे कोड निम्नलिखित है:

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

हो रही इकाई ठीक काम करता है, लेकिन detach विधि के आह्वान के बाद त्रुटि देता है:

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) 

मैं अधिक जानकारी नहीं मिल सकता है और समझ में नहीं आता कि समस्या क्या है ...

क्या कोई मदद कर सकता है?

उत्तर

7

मुझे लगता है कि आप जेबए 2.0 का उपयोग हाइबरनेट के गलत संस्करण के साथ कर रहे हैं, जो जेपीए 2.0 स्पेक को लागू नहीं करता है। अपवाद बताता है कि EntityManagerImpl में आवश्यक विधि नहीं है।

मैं सुझाव देता हूं कि हाइबरनेट को 3.5 तक अपग्रेड करें, जो एक जेपीए 2.0 कार्यान्वयन है।

+0

धन्यवाद! बस मेरे हाइबरनेट जेएआर को 3.5.0 सीआर 2 में अपडेट किया गया और यह बहुत अच्छा काम करता है। – Julien

+0

अलग-अलग ऑपरेशन रिकर्सिव (यानी कैस्केड में) है? –

+0

@ गुइडो - हाँ, अगर आपके पास कैस्केड टाइप है = DETACH – Bozho

1

आप स्पष्ट रूप से सभी इकाइयों को अलग कर सकते हैं लेकिन केवल एक इकाई को अलग करना जेपीए 2.0 में नहीं है। http://java.sun.com/javaee/5/docs/api/javax/persistence/EntityManager.html

आप शायद अपने निर्माण रास्ते में impl हाइबरनेट था, और अपने आवेदन सर्वर (EclipseLink? या पुराने हाइबरनेट संस्करण) पर एक और कार्यान्वयन ...

entityManager.detach(...) हाइबरनेट में है, लेकिन जेपीए में नहीं तो आप की जरूरत है इस फ़ंक्शन का उपयोग करने के लिए आपके एप्लिकेशन सर्वर पर हाइबरनेट इत्यादि ...

+0

बोझो के उत्तर ने मेरी समस्या का समाधान किया। जेपीए 2.0 (जे 2 ईई 6) – Julien

+0

में ठीक एक इकाई काम करता है ठीक है मेरी गलती आप जेपीए 2.0 इंटरफेस में सही हैं –