कृपया JPA @Column एनोटेशन के संदर्भ में सम्मिलन योग्य = गलत और अद्यतन योग्य = गलत के बारे में बताएं


151

यदि कोई फ़ील्ड एनोटेट है insertable=false, updatable=false, तो इसका मतलब यह नहीं है कि आप मूल्य नहीं डाल सकते हैं और न ही मौजूदा मूल्य को बदल सकते हैं? आप ऐसा क्यों करना चाहते हो?

@Entity
public class Person {

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

    @OneToMany(mappedBy="person", cascade=CascadeType.ALL)
    private List<Address> addresses;
}

@Entity
public class Address {

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

    @ManyToOne
    @JoinColumn(name="ADDRESS_FK")
    @Column(insertable=false, updatable=false)
    private Person person;
}

जवाबों:


121

आप ऐसा तब करेंगे जब प्रश्न में संबंधित इकाई को बनाने / अद्यतन करने की जिम्मेदारी वर्तमान इकाई में नहीं होगी। जैसे आप एक Personऔर एक है Address। आप जोड़ना चाहते हैं insertable=false, updatable=falseके लिए @OneToManyके साथ संबंध Personमें इकाई Addressइकाई हैं, क्योंकि यह की जिम्मेदारी नहीं है Addressबना सकते हैं या एक अद्यतन करने के लिए इकाई Person। यह दूसरा रास्ता है।


यह insertable=false,updatable=falseरिश्ते के किसी एक पक्ष को परिभाषित करने को संदर्भित करता है ।
बालुसक

3
आप कह रहे हैं कि व्यक्ति पर अद्यतन योग्य = गलत होने के कारण यह पता अपडेट करते समय Person.name को अपडेट करने को अक्षम कर देगा (मैं इससे सहमत नहीं हूं क्योंकि यह कैस्केड का उद्देश्य है)। इसके अलावा यू कह रहे हैं कि @ विदेशी मूल परिभाषा कुछ अलग है जब इसकी विदेशी कुंजी (व्यक्ति) और जब यह विदेशी कुंजी नहीं है (जैसा कि अद्यतन करने को अक्षम करने के लिए कोई संदर्भित इकाई नहीं है)। Updatable के लिए javadoc पढ़ने से मैं कहूंगा कि यह दिए गए पते के लिए व्यक्ति को बदलने के लिए अक्षम हो जाएगा यदि यह एक बार कायम है। क्या आप कृपया समझा सकते हैं?
flowy

8
मुझे लगता है कि आपके कहने का मतलब है ... to the @ManyToOne relationship with the ...??
मार्टिन कोंकणी

111

परिभाषित करना insertable=false, updatable=falseतब उपयोगी होता है जब आपको एक इकाई में एक से अधिक बार क्षेत्र को मैप करने की आवश्यकता होती है, आमतौर पर:

यह आईएमओ एक शब्दार्थ नहीं है, लेकिन निश्चित रूप से एक तकनीकी है।


15
मैं दृढ़ता से मानता हूं कि यह उत्तर बहुत बेहतर है कि स्वीकृत है। स्वीकृत उत्तर उस भावना को व्यक्त करता है, जो डालने योग्य / अद्यतन करने योग्य विशेषता का संबंध संबंधित इकाई के निर्माण / अद्यतन से है, जबकि इन विशेषताओं के पीछे वास्तविक उद्देश्य वर्तमान इकाई में कॉलम के प्रविष्टि / अद्यतन को रोकना है। संबंधित इकाई का निर्माण / अद्यतन मानचित्रण एनोटेशन के कैस्केड विशेषता से निपटा जाता है।
जयंत

25

मैं BalusC और पास्कल थिवेंट के उत्तरों को एक और सामान्य उपयोग में जोड़ना चाहूंगाinsertable=false, updatable=false :

एक कॉलम पर विचार करें जो एक आईडी नहीं है लेकिन किसी प्रकार का अनुक्रम संख्या है । अनुक्रम संख्या की गणना करने की जिम्मेदारी जरूरी नहीं कि आवेदन की हो।

उदाहरण के लिए, अनुक्रम संख्या 1000 से शुरू होती है और प्रत्येक नई इकाई के लिए एक से बढ़ाना चाहिए। यह आसानी से किया जाता है, और बहुत उचित रूप से डेटाबेस में, और ऐसे मामलों में ये कॉन्फ़िगरेशन समझ में आता है।


1
दृश्यों को जेपीए द्वारा समर्थित किया जाता है, इसलिए आप अपने अनुक्रम को जेपीए एनोटेशन के साथ भी परिभाषित कर सकते हैं।
ईस

8

एक अन्य उदाहरण "create_on" कॉलम पर होगा जहां आप डेटाबेस को तिथि निर्माण को संभालने देना चाहते हैं


क्या हाइबरनेट को अद्यतन करने योग्य = गलत एनोटेशन के आधार पर अपडेट को ब्लॉक करना चाहिए? मेरे जेपीए रिपॉजिटरी परीक्षण में इस एनोटेशन के साथ एक create_on कॉलम बिना किसी शिकायत के अपडेट स्वीकार करता है।
च्रिसिनमटाउन

1
@chrisinmtown Eclipselink में sql में कॉलम बिल्कुल शामिल नहीं होगा। मुझे उम्मीद है कि यह हाइबरनेट के साथ भी ऐसा ही है
Jaqen H'ghar
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.