2011-12-21 20 views
9

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

इसमें लगभग 50k रिकॉर्ड हैं। इसलिए, आईडी कॉलम जोड़ने के लिए तालिका को संशोधित करने में व्यवहार्य विकल्प नहीं दिखता है।

क्या यह संभव हो सकता है?

उत्तर

22
  1. Hibernate requires that entity tables have primary keys. कहानी का अंत।
  2. 50k रिकॉर्ड्स बस इतना नहीं है जब आप किसी डेटाबेस के बारे में बात कर रहे हों।

मेरी सलाह: तालिका में एक ऑटोइनक्रिकमेंट पूर्णांक पीके कॉलम जोड़ें। आप आश्चर्यचकित होंगे कि यह कितनी तेज़ है।

+3

यहां पर उत्तर दिया गया जवाब [हाइबरनेट और कोई पीके काम करता है] (http://stackoverflow.com/questions/767277/hibernate-and-no-pk) बिल्कुल आपकी डेटाबेस तालिका को छूए बिना। यह हाइबरनेट का एक उदाहरण है जो वास्तव में डुप्लिकेट की जांच नहीं करता है। – Sankalp

8

तो, आईडी कॉलम जोड़ने के लिए तालिका को संशोधित करने में व्यवहार्य विकल्प नहीं दिखता है।

ऐसा क्यों है? क्या आपका मतलब है, क्योंकि इसमें पहले से ही पचास हजार रिकॉर्ड हैं? मेरा विश्वास करो, यह वास्तव में बहुत ज्यादा नहीं है।


यहां तक ​​कि अगर मेज एक किराए कुंजी नहीं है, और एक प्राथमिक कुंजी बाधा नहीं है, और यहां तक ​​कि यदि आप तालिका को बदलने के लिए तैयार नहीं कर रहे हैं, यह अभी भी शायद किसी प्रकार का है candidate key — जो कि कॉलम के कुछ सेट हैं जो कभी शून्य नहीं होते हैं, और जिनके मूल्य विशिष्ट रूप से रिकॉर्ड की पहचान करते हैं। अपनी विशिष्टता और गैर-शून्यता को लागू करने के लिए तालिका को बदलने के बावजूद, आप हाइबरनेट को बता सकते हैं कि वे कॉलम composite ID बनाते हैं।

+3

यह एक अच्छा जवाब है लेकिन ओपी का बैक अप लेने के लिए, कई परिस्थितियां हैं जब कोई टेबल को बदल नहीं सकता है और "इसे सही बना सकता है"। उदाहरण के लिए, ग्राहक हमें एक ऐसा दृश्य देता है जिसे बनाया गया था जिसमें कोई आईडी, कोई प्राथमिक कुंजी नहीं है, और, कई मामलों में, डुप्लिकेट पंक्तियां। बहुत निराशाजनक लेकिन ऐसा होता है। – cbmeeks

+1

पुराना धागा, लेकिन मैं अभी भी इसे Google पर ढूंढ रहा हूं।इतना उल्लेखनीय है कि एंटरप्राइज़ वातावरण में काम करते समय, आप बड़ी थ्रूपुट और लाखों पंक्तियों के साथ एक तालिका में एक अतिरिक्त कॉलम जोड़ने को उचित ठहराने में सक्षम नहीं होंगे क्योंकि आप इसे अपने चुने हुए ओआरएम फ्रेमवर्क से पूछ नहीं सकते ... आप बस इसे गोल करना है। – cowls

0

मुझे प्राथमिक कुंजी के बिना टेबल और समाधान के रूप में शून्य के लिए समाधान मिला है। यह ओरेकल डीबी पर काम करेगा। हो सकता है कि अन्य डीबी के लिए कुछ समान हो।

  1. आप POJO कक्षा में नए प्राथमिक कुंजी बनाने चाहिए:

    @Id @Column (नाम = "आईडी") निजी पूर्णांक आईडी;

और इस

getEntityManager().createNativeQuery("select rownum as id, ..... 

तरह createNativeQuery का उपयोग देशी क्वेरी प्राथमिक कुंजी उत्पन्न होगा और आप अद्वितीय परिणाम मिलेंगे।

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