2011-02-02 18 views
7

मैं जेपीए Toplink जरूरी और एसक्यूएल सर्वर का उपयोग कर रहा 2008क्यों जेपीए जारी है() ऑटो-वृद्धि प्राथमिक आईडी उत्पन्न नहीं करता है?

मेरा लक्ष्य डेटा है कि तालिका में सम्मिलित किया जा रहा है की ऑटो वेतन वृद्धि प्राथमिक कुंजी मूल्य प्राप्त करने के लिए है। मैं जेडीबीसी में जानता हूं, वहाँ प्राप्त है ISertedId() विधि की तरह है जो आपको स्वत: वृद्धि प्राथमिक आईडी की आईडी देता है (लेकिन यह डालने वाले सम्मिलित कथन के बाद है)

जेपीए में, मुझे पता चला कि @GenratedValue annotation चाल चल सकता है।

@Entity 
@Table(name = "tableOne") 
public class TableOne implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    @Basic(optional = false) 
    @Column(name = "tableId") 
    private Integer tableId; 

अब अगर मैं कोड को चलाने के नीचे यह मुझे देना चाहिए ऑटो आईडी वृद्धि की जाती है, लेकिन यह NULL भेजता है ...

EntityManager em = EmProvider.getInstance().getEntityManagerFactory().createEntityManager(); 
EntityTransaction txn = em.getTransaction(); 
txn.begin(); 

TableOne parent = new TableOne(); 
em.persist(parent); //here I assume that id is pre-generated for me. 
System.out.println(parent.getTableId()); //this returns NULL :(
+0

मैं आईडी प्राप्त कर सकते हैं करने के लिए प्रतिबद्ध है कि अगर मैं:। Em.getTransaction() के लिए प्रतिबद्ध() लेकिन वहाँ पहले से ही जारी रहती है साथ आईडी प्राप्त करने के लिए कोई रास्ता नहीं है ??? हम्म –

+0

आपकी कोड के अनुसार काम करना चाहिए। मैंने इसका परीक्षण किया और मुझे आईडी करने से पहले आईडी मिलती है या यदि मैं रोलबैक करता हूं। अजीब है कि यह नहीं करता है। – Joel

+0

क्या यह कोई फर्क पड़ता है यदि tableId इंटीजर की बजाय int है? – Joel

उत्तर

2

हम भी एसक्यूएल सर्वर 2008 और यह प्रयोग कर रहे हैं मेरे लिए कभी काम नहीं किया है इसलिए मैं हमेशा डालने वाली आईडी प्राप्त करने के लिए अलग क्वेरी "SELECT @@IDENTY" निष्पादित करता हूं।

नेट पर मिलने का कारण यह था कि ऑटो आईडी (पहचान) डेटाबेस द्वारा प्रबंधित की जाती है और जब तक आप पंक्ति को सक्रिय नहीं करते हैं या मैन्युअल रूप से डेटाबेस से जानकारी पुनर्प्राप्त नहीं करते हैं, तब तक इकाई में कभी नहीं लाया जाता है।

+0

क्या आपका मतलब है क्योंकि एसक्यूएल सर्वर 2008, हम @ GeneratedValue.Sequence या टेबल या पहचान उपयोग नहीं कर सकते ??? मुझे लगा कि मुझे पहले फ्लश करना था (जेनरेट आईडी प्राप्त करने के लिए डीबी पर कॉल डालें) लेकिन अगर मेरा प्राथमिक आईडी मिल सकता है तो मेरा लक्ष्य डालने के बिना है। –

+0

आप सही हो सकते हैं, दस्तावेज़ एसक्यूएनसीई ऑब्जेक्ट का समर्थन करने के लिए SQL सर्वर सूचीबद्ध नहीं करता है .... "अनुक्रम वस्तुएं आईडी उत्पन्न करने के लिए विशेष डेटाबेस ऑब्जेक्ट्स का उपयोग करती हैं। अनुक्रम वस्तुएं केवल कुछ डेटाबेसों में समर्थित हैं, जैसे ओरेकल, डीबी 2, और पोस्टग्रेस। " http://en.wikibooks.org/wiki/Java_Persistence/Identity_and_Sequencing#Table_sequencing –

+0

एक उत्तर के रूप में चिह्नित, SQL सर्वर –

11

समस्या आप पहचान आईडी पीढ़ी का उपयोग कर रहे है। पहचान आईडी पीढ़ी प्रीलोकेशन नहीं कर सकती क्योंकि उन्हें आईडी उत्पन्न करने के लिए INSERT की आवश्यकता होती है। टेबल और अनुक्रम ID पीढ़ी समर्थन preallocation, और मैं हमेशा इस मुद्दे की वजह से और प्रदर्शन की वजह से इन के उपयोग की सलाह देते हैं, और कभी नहीं पहचान का उपयोग कर। जब फ्लश() कॉल करके पहचान आईडी पीढ़ी का उपयोग करके

आप आईडी ट्रिगर कर सकते हैं उत्पन्न किया जा करने के लिए। इकाई आप उचित मूल्य के साथ आईडी क्षेत्र है ताज़ा करने के बाद

public void create(T entity) { 
    getEntityManager().persist(entity); 
    getEntityManager().flush(); 
    getEntityManager().refresh(entity); 
} 

:

+0

hmmm अनुक्रम द्वारा समर्थित नहीं किया जा रहा है मेरे लिए काम नहीं कर रहा है। मैंने अपनी एनोटेशन को इकाई वर्ग में बदल दिया: '@Id @ सिकेंस जेनरेटर (नाम =" seq ", अनुक्रमनाम =" seq ") @GeneratedValue (strategy = GenerationType।अनुक्रम, जनरेटर = "seq") ' –

+1

फिर em.persist (myBean) के बाद; int insertedId = myBean.getId(); यह getId() वापस लौट रहा है ... क्या मैं कुछ गलत कर रहा हूँ? –

+1

यह एक समय की समस्या है। जब आप आईडी मान प्राप्त करने का प्रयास करते हैं तो जेपीए ने डेटा सम्मिलित नहीं किया था। आपको डेटाबेस पर संशोधनों को शुरू करने के लिए फ्लश करना होगा। बाद में आपके पास आईडी है। बेहतर होगा कि जब आप getId() को कॉल करते हैं तो जेपीए डीबी पर संशोधन करता है। –

6

बस यह करते हैं।

+3

'फ्लश()' जोड़ने का कारण यह है कि 'persist()' को 'जेनरेटेड वैल्यू' उत्पन्न करने की स्पष्ट गारंटी नहीं है, लेकिन इसे 'फ्लश() 'पर या उससे पहले उत्पन्न किया जाना चाहिए। यह प्रश्न देखें: http://stackoverflow.com/questions/9087848/when-does-the-jpa-set-a-generatedvalue-id – Raedwald

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