2010-05-12 13 views
11

मैं हाइबरनेट/जेपीए का उपयोग करके कुछ बुनियादी इकाइयों को लागू करने की कोशिश कर रहा हूं। प्रारंभ में कोड MySQL पर तैनात किया गया था और ठीक काम कर रहा था। अब, मैं PostgreSQL का उपयोग करने के लिए इसे बंद कर रहा हूँ। MySQL में, मेरा इकाई वर्ग निम्न सिंटैक्स का ऑटो-incrementing लंबे मूल्य के रूप में अपनी प्राथमिक कुंजी परिभाषित करता है:हाइबरनेट/जेपीए और पोस्टग्रेएसक्यूएल - प्राथमिक कुंजी?

@Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 

हालांकि, मैंने पाया कि मैं PostgreSQL के साथ त्रुटियों मिलता है जब मैं कोशिश करते हैं और एक पर कई रिकॉर्ड सम्मिलित पहर। PostgreSQL में एक ही ऑटो-वृद्धिशील व्यवहार प्राप्त करने के लिए मुझे अपनी प्राथमिक कुंजी को एनोटेट करने की आवश्यकता क्या है क्योंकि मेरे पास MySQL के साथ है? आप जो भी मदद दे सकें मैं उसका आभारी होऊंगा!

+1

GenerationType.AUTO किसी भी डेटाबेस के साथ कोई समस्या नहीं पैदा करना चाहिए। क्या आप अपवाद और/या अपना सम्मिलन कोड पोस्ट कर सकते हैं? यह ध्यान देने योग्य है कि MySQL पर, GenerationType.AUTO वृद्धि प्रकार में परिवर्तित होता है जबकि PostgreSQL पर, यह डिफ़ॉल्ट रूप से अनुक्रम का उपयोग करता है। – ig0774

+0

विवरण के लिए यहां http://docs.jboss.org/hibernate/core/3.5/reference/en/html/mapping.html#mapping-declaration-id दस्तावेज़ देखें। मैं इसे एक बार फिर कोशिश करूंगा और फिर पोस्ट करूंगा अपवाद मुझे मिल रहा है। जिस तरह से मेरे पास मेरी इकाई वर्ग सेटअप है, वह आईडी परिभाषित और @MappedSuperclass एनोटेशन के साथ एक सार आधार वर्ग होना है, और फिर वहां से मेरी बाकी इकाइयों को प्राप्त करें। क्या आपको लगता है कि PostgreSQL में कोई समस्या पैदा होगी? – Shadowman

+0

क्या आप जेपीए 'पर्सिस्ट()' और 'मर्ज()' या सीधा एसक्यूएल के साथ सम्मिलित हैं? 'जेनरेशन टाइप। ऑटो' का अर्थ है "दृढ़ता प्रदाता को उचित रणनीति चुननी चाहिए" (जेपीए 2.0 अंतिम रिलीज, धारा 11.1.17)। यह जरूरी नहीं है कि अनुक्रम संबंध लागू करें। केवल 'GenerationType.SEQUENCE' जेपीए प्रदाता को अनुक्रम का उपयोग करने के लिए मजबूर करता है। सवाल यह सुनिश्चित करने के लिए वर्तमान में बहुत अस्पष्ट है, लेकिन शायद हाइबरनेट ने पोस्टग्रेज़ के तहत एक तालिका के साथ 'आईडी' उत्पन्न करने का निर्णय लिया है और शायद आप एसक्यूएल को कॉलम आईडी आईडी के लिए एक गैर-डिफ़ॉल्ट डिफ़ॉल्ट अनुक्रम मान की उम्मीद कर रहे हैं। कृपया पोस्टग्रेस संबंध दिखाएं (psql's '\ d')। –

उत्तर

10

मैंने इस मुद्दे को हल किया है। इससे पहले - - मेरी MySQL कार्यान्वयन में मैं निम्नलिखित हस्ताक्षर के साथ एक सार आधार वर्ग का इस्तेमाल किया:

@MappedSuperclass 
public abstract class AbstractDomainEntity implements Serializable { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id = null; 

     ... 
} 

... और फिर मैं अपनी शेष संस्थाओं में से प्रत्येक में इस बढ़ाया। मैंने तब से इस विशेषता को इकाइयों में नीचे धकेल दिया है, और @ जेनरेशन टाइप को अनुक्रम के रूप में कॉन्फ़िगर किया है। उदाहरण के लिए:

public class UserProfileBean extends AbstractIdentifiedDomainEntitiy { 

    @Id 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "profile_seq") 
    @SequenceGenerator(name = "profile_seq", sequenceName = "profile_seq") 
    private Long id = null; 

     ... 
} 

ऐसा करके, उचित दृश्यों उत्पन्न और हाइबरनेट/JPA और PostgreSQL के भीतर उपयोग किया जा रहा है। इससे पहले, अगर मैंने जेनरेशन टाइप को अनुक्रम के रूप में घोषित किया, तो भी कोई भी नहीं बनाया जा रहा था। इस मामले में आपकी सभी मदद और सलाह के लिए धन्यवाद!

+0

कभी-कभी नामों से बचने और उद्धरण डालने की आवश्यकता होती है जैसे: name = "\" profile_seq \ "" –

17

जेनरेशन टाइप टाइप।

+0

यह चाल है! धन्यवाद। –

+0

क्या एक किंवदंती है! यह मेरे @MappedSuperclass पर मेरे लिए काम किया :) –

+0

स्वीकार्य से काफी बेहतर है। जबकि वह संभवतः काम करता है, इसके लिए कोई कस्टम जनरेटर परिभाषा की आवश्यकता नहीं होती है। धन्यवाद! – nerdwaller

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