2013-03-19 6 views
13

मैं एक बहुत-से-एक रिश्ता है कि मैं व्यर्थ होने के लिए चाहते हैं:नहीं बना सकता @ManyToOne संबंध नल

@ManyToOne(optional = true) 
@JoinColumn(name = "customer_id", nullable = true) 
private Customer customer; 

दुर्भाग्य से, जेपीए मेरी डेटाबेस में स्तंभ के रूप में नहीं शून्य की स्थापना रखता है। क्या कोई इसे समझा सकता है? क्या यह काम करने का कोई तरीका है? ध्यान दें कि मैं जेबॉस 7, जेपीए 2.0 का उपयोग हाइबरनेट के साथ दृढ़ता प्रदाता और एक PostgreSQL 9.1 डेटाबेस के रूप में करता हूं।

संपादित:

मैं अपने इस समस्या का कारण मिल गया। जाहिरा तौर पर यह है की वजह से जिस तरह से करने के लिए मैं संदर्भित इकाई Customer में प्राथमिक कुंजी परिभाषित:

@Entity 
@Table 
public class Customer { 
    @Id 
    @GeneratedValue 
    @Column(columnDefinition="serial") 
    private int id; 
} 

ऐसा लगता है कि प्राथमिक कुंजी के लिए @Column(columnDefinition="serial") का उपयोग कर स्वचालित रूप से डेटाबेस में NOT NULL करने के लिए इसे संदर्भित विदेशी कुंजी सेट करता है। क्या कॉलम प्रकार को serial के रूप में निर्दिष्ट करते समय वास्तव में अपेक्षित व्यवहार है? क्या इस मामले में निरर्थक विदेशी कुंजी सक्षम करने के लिए कोई कामकाज है?

अग्रिम धन्यवाद।

उत्तर

9

मुझे मेरी समस्या का समाधान मिला। इकाई Customer में प्राथमिक कुंजी को परिभाषित करने का तरीका ठीक है, समस्या विदेशी कुंजी घोषणा में रहती है। ,

@ManyToOne 
@JoinColumn(columnDefinition="integer", name="customer_id") 
private Customer customer; 

वास्तव में अगर विशेषता columnDefinition="integer" छोड़ दिया जाता है डिफ़ॉल्ट रूप से विदेशी कुंजी इच्छा स्रोत स्तंभ के रूप में सेट किया जा: यह इस तरह से घोषित किया जाना चाहिए अपने स्वयं के अनुक्रम के साथ एक नहीं अशक्त धारावाहिक। यह निश्चित रूप से नहीं है कि हम क्या चाहते हैं क्योंकि हम केवल ऑटो-वर्धित आईडी का संदर्भ देना चाहते हैं, न कि नया बनाना।

इसके अलावा, ऐसा लगता है कि विशेषता name=customer_id भी कुछ परीक्षण करने के दौरान देखी गई है। अन्यथा विदेशी कुंजी कॉलम अभी भी स्रोत कॉलम के रूप में सेट किया जाएगा। यह मेरी राय में एक अजीब व्यवहार है। इसे स्पष्ट करने के लिए टिप्पणियां या अतिरिक्त जानकारी का स्वागत है!

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

0

यह बहुत अजीब है।

जेपीए में नालीबल पैरामीटर डिफ़ॉल्ट रूप से सत्य है। मैं हर समय इस तरह के विन्यास का उपयोग करता हूं और यह ठीक काम करता है। यदि आप इकाई को बचाने की कोशिश करते हैं तो यह सफल होना चाहिए।

क्या आपने इस रिश्ते के लिए बनाई गई तालिका को हटाने का प्रयास किया था? हो सकता है कि आपके पास उस कॉलम के साथ विरासत तालिका हो?

या शायद आपको कोड के अन्य हिस्सों पर समाधान खोजने का प्रयास करना चाहिए, क्योंकि यह उचित कॉन्फ़िगरेशन है।

नोट: मैंने पोस्टग्रेएसक्यूएल पर जेपीए 2 और हाइबरनेट के साथ इस कॉन्फ़िगरेशन को आजमाया है।

संपादित

उस मामले में हो सकता है आप प्राथमिक कुंजी का एक छोटा सा अलग परिभाषा की कोशिश कर सकते हैं।

उदाहरण के लिए आप इस तरह परिभाषा का उपयोग कर सकते हैं:

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

और PostgreSQL

id bigint NOT NULL 
-- with constraint 
CONSTRAINT some_table_pkey PRIMARY KEY (id) 

उत्पन्न होगा, तो यह अच्छा है पर्याप्त आप इस समाधान की कोशिश कर सकते हैं।

+0

वास्तव में एक समाधान मैं पर विचार किया है कि घोषित करने से उभरा। दुर्भाग्यवश यह डेटाबेस से आईडी पीढ़ी को सक्षम नहीं करता है, और यह एक कार्यक्षमता है जिसे मुझे मैन्युअल रूप से डेटा डालने पर आवश्यकता होती है (उदाहरण के लिए हाइबरनेट के import.sql का उपयोग करके)। सौभाग्य से मुझे लगता है कि मैं समाधान ढूंढने वाला हूं। मैं बस कुछ परीक्षण कर रहा हूं और यदि यह सफल है तो मैं समाधान पोस्ट करूंगा। आपकी सहायता के लिए धन्यवाद. – vcattin

7

मैं इस समस्या में आए लेकिन मैं इसे इस तरह से हल करने में सक्षम था:

@ManyToOne 
@JoinColumn(nullable = true) 
private Customer customer; 

हो सकता है कि समस्या @ManyToOne(optional = true)

+6

'nullable = false' ?? 'FALSE'? क्यों 'झूठा', सच नहीं है? – Andremoniy

+0

निश्चित रूप से यह 'nullable = true' होना चाहिए – artificis

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