2010-07-25 15 views
13

हर @Entity के लिए मैं निम्नलिखित करने की आवश्यकता:किसी भी जेपीए इकाई की प्राथमिक कुंजी कैसे प्राप्त करें?

public <Entity> boolean insert(final Entity entity){ 
    if (em.find(entity.getClass(), entity.getId()) == null) { 
     et.begin(); 
     em.persist(entity); 
     et.commit(); 
     return true; 
    } 
    return false; 
} 

है कि इकाई जारी रहती है, अगर यह मौजूद नहीं था, और अगर यह किया था पता है या मौजूद नहीं। एंटिटी के साथ मैं @ एन्टीटी तक पहुंचने की कोशिश कर रहा हूं, हालांकि मुझे एहसास है कि यह विरासत संबंध नहीं है। प्रत्येक जेपीए इकाई को संदर्भित करने के लिए मैं किस वर्ग का उपयोग कर सकता हूं? मैं सिर्फ एक इंटरफ़ेस/अमूर्त वर्ग MyEntities बना सकता हूं और उनमें से सभी का उत्तराधिकारी हो सकता है, लेकिन क्या वह तरीका है? मैं कम कोड की उम्मीद कर रहा हूं। साथ ही, मैं प्रत्येक इकाई की प्राथमिक कुंजी निकालने में सक्षम होने की अपेक्षा करता हूं, जैसा कि मैंने .getId() में प्रयास किया है।

उत्तर

36

यह कार्यक्षमता जेपीए 2.0 में जोड़ा गया था। सीधे शब्दों में कहते हैं:

Object id = entityManagerFactory.getPersistenceUnitUtil().getIdentifier(entity); 
+0

एक शून्य सूचक अपवाद फेंकता है –

4

आम इंटरफ़ेस दृष्टिकोण जो मैं उपयोग करता हूं और यह ठीक काम करता है। शुद्ध जेपीए का उपयोग करके मुझे पहचानकर्ता प्राप्त करने का कोई तरीका नहीं दिखता है।

merge() पर एक नज़र डालें। मैं यह बहुत अपने आप का उपयोग किया है नहीं लेकिन मुझे लगता है

हाइबरनेट इस

Serializable id = session.getIdentifier(entity); 

करने के तरीके है लेकिन इस जेपीए मानक नहीं है।

4

Generic Dao approach के बारे में एक लेख पढ़ें।

मैं आपकी समस्या को स्पष्ट रूप से समझ नहीं पा रहा हूं, लेकिन यदि आप इकाई आईडी प्राप्त करना चाहते हैं - बस इसे प्राप्त करें। इसके बाद जारी रहती उपलब्ध विधि पूरा अर्थात

em.persist(entity); 
et.commit(); 
int id = entity.getId() 

है मैं आमतौर पर क्षेत्र id और उसके accessors के साथ एक कक्षा AbstractEntity बनाने के लिए और इस वर्ग से मेरे सारे अन्य संस्थाओं के वारिस।

इस दृष्टिकोण के साथ एकमात्र समस्या यह है कि यदि आपको अपनी किसी भी संस्था को सीरियलज़ेबल बनाने की आवश्यकता होगी, तो आपको AbstractEntity क्रमबद्ध करने की आवश्यकता होगी यानी अन्य सभी इकाइयां क्रमबद्ध हो जाएंगी। अन्यथा क्षेत्र id इकाई में क्रमबद्ध नहीं किया जाएगा जो धारावाहिक होना चाहिए।

1

इकाई आईडी प्राप्त करने में कठिनाई का एक और तरीका है:

Session session = entityManager.unwrap(Session.class); 
Object entityId = session.getId(entity); 

यह दृष्टिकोण extractPrimaryKeyFromObject() ObjectBuilder वर्ग से विधि का उपयोग करता।

संबंधित मुद्दे