2012-03-16 14 views
77

मैं जेपीए (एक्लिप्ससेंक) और स्प्रिंग का उपयोग कर रहा हूं। मैं एक स्वत: जनरेट आईडी के साथ एक सरल इकाई है कहते हैं:जेपीए - जारी रखने के बाद एक ऑटो जनरेटेड आईडी लौट रहा है()

@Entity 
public class ABC implements Serializable { 
    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    private int id; 

    // ... 
} 

मेरी डीएओ कक्षा में, मैं एक डालने विधि है कि इस इकाई पर persist() कॉल की है। मैं नई इकाई के लिए जेनरेट आईडी को वापस करने की विधि चाहता हूं, लेकिन जब मैं इसका परीक्षण करता हूं, तो यह इसके बजाय 0 देता है।

public class ABCService { 
    @Resource(name="ABCDao") 
    ABCDao abcDao; 

    public int addNewABC(ABC abc) { 
     return abcDao.insertABC(abc); 
    } 
} 
+0

इसी प्रकार एक के बारे में बताता है जेपीए में नहीं है, http://stackoverflow.com/q/3328813/366964 –

+0

उत्तर के लिए धन्यवाद देख सकते हैं। और एक मुश्किल समाधान (एक जेपीए नहीं) के रूप में हम यूनिक्स टाइमस्टैम्प जैसी एक और अद्वितीय आईडी का उपयोग कर सकते हैं। – sura2k

+1

संभावित डुप्लिकेट [जेपीए ने @GeneratedValue @Id] कब सेट किया है (http://stackoverflow.com/questions/9087848/when-does-the-jpa-set-a-generatedvalue-id) – Raedwald

उत्तर

121

आईडी केवल फ्लश समय में उत्पन्न होने की गारंटी है:

public class ABCDao { 
    @PersistenceContext 
    EntityManager em; 

    @Transactional(readOnly=false) 
    public int insertABC(ABC abc) { 
     em.persist(abc); 
     // I WANT TO RETURN THE AUTO-GENERATED ID OF abc 
     // HOW CAN I DO IT? 
     return abc.id; // ??? 
    } 
} 

मैं भी है कि यदि एक फर्क नहीं पड़ता, एक सेवा वर्ग कि डीएओ लपेटता है। एक इकाई को कायम रखने से यह दृढ़ता संदर्भ के लिए "संलग्न" हो जाता है। तो, या तो इकाई प्रबंधक को स्पष्ट रूप से फ्लश करें:

em.persist(abc); 
em.flush(); 
return abc.getId(); 

या इकाई को इसके आईडी के बजाय स्वयं वापस कर दें। जब लेनदेन समाप्त होता है, तो फ्लश होगा, और लेनदेन के बाहर इकाई के उपयोगकर्ता इस प्रकार इकाई में जेनरेट आईडी देखेंगे।

@Override 
public ABC addNewABC(ABC abc) { 
    abcDao.insertABC(abc); 
    return abc; 
} 
+6

एनबी: यह ज़रूरतें '@ जेनरेटेड वैल्यू' के साथ आईडी फ़ील्ड को एनोटेट करने के लिए - –

+0

जो कुछ भी शामिल है, क्या आप इसे समग्र आईडी http://stackoverflow.com/questions/31362100/explain-behaviors-in-mapping-auto के साथ प्राप्त करने के प्रयास में समस्याओं की व्याख्या कर सकते हैं। -इंवर्टेड-कंपोजिट-आईडी-अनुक्रम-साथ-हिबर्न – bl3e

+0

क्या जारी रखने के बाद मैन्युअल रूप से फ्लश करने का कोई प्रदर्शन जुर्माना (या कोई अन्य नकारात्मक प्रभाव) है? –

-1
em.persist(abc); 
em.refresh(abc); 
return abc; 
+0

यह विधि मेरे लिए काम नहीं करती है। यह त्रुटि मिली: javax.persistence.PersistenceException: org.hibernate.HibernateException: यह उदाहरण डेटाबेस में अभी तक पंक्ति के रूप में मौजूद नहीं है] – rtcarlson

+0

@rtcarlson, हाँ यह काम नहीं करेगा। यदि आप एक नई वस्तु बना रहे हैं, तो आपको जो चाहिए वह 'em.flush()' em.refresh (abc) 'है। –

2

तुम भी पहचान जो डालने के बाद ही उपलब्ध है के बजाय GenerationType.TABLE इस्तेमाल कर सकते हैं।

1

इस तरह मैंने किया है:

EntityManager entityManager = getEntityManager(); 
EntityTransaction transaction = entityManager.getTransaction(); 
transaction.begin(); 
entityManager.persist(object); 
transaction.commit(); 
long id = object.getId(); 
entityManager.close(); 
+0

तालिका में डेटा को जारी रखने के बाद शून्य को रिटर्न के रूप में काम नहीं कर रहा है। या तो रीफ्रेश इस मामले में काम नहीं कर रहा है .. इसके लिए मुझे क्या करना चाहिए। कृपया एक तरीका सुझाएं ... धन्यवाद –

+0

@ विक्रांतकश्यप कृपया छोटे कोड के साथ एक नया प्रश्न पोस्ट करें और मुझे जिक्र करें ताकि मैं एक नज़र देख सकूं। –

6
@Entity 
public class ABC implements Serializable { 
    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    private int id; 
} 

जाँच लें कि @GeneratedValue अंकन अपने इकाई class.This अपने इकाई संपत्ति स्वत: जनरेट व्यवहार

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