2011-08-15 13 views
5

क्या कोई मुझे यह समझने में सहायता कर सकता है कि हाइबरनेट को मैं जो करना चाहता हूं उसे कॉन्फ़िगर कैसे करें।हाइबरनेट - बच्चों को रखने के लिए केवल माता-पिता को कैसे बनाए रखें

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

तो क्योंकि मैं अपार्टमेंट फार्म मैं गलत पर lazyloading की स्थापना की है में उपलब्ध लिस्टिंग हूँ:

@OneToMany 
@JoinColumn (name = "appartmentId") 
@LazyCollection (LazyCollectionOption.FALSE) 
private List<Room> room; 

लेकिन अगर मैं एक अपार्टमेंट संपादित करें और इसे स्टोर, सभी अपार्टमेंट कमरे अचानक गायब। डेटाबेस में वे हटाए नहीं जाते हैं, लेकिन dereferenced (जैसा कि appartmentId = null में)।

तो मैं केवल अपने अपार्टमेंट-ऑब्जेक्ट को बनाए रखने के लिए हाइबरनेट को कैसे कॉन्फ़िगर कर सकता हूं। और बच्चों को बिल्कुल छूएं नहीं?

यह मेरा बचाने वाली कार्रवाई है:

public String save() throws Exception { 
    boolean isNew = (appartment.getAppartmentId() == null); 

    appartment = appartmentManager.save(appartment); 

    String key = (isNew) ? "appartment.added" : "appartment.updated"; 
    saveMessage(getText(key)); 

    return SUCCESS; 
} 
+0

क्या आप इसे स्टोर करने से पहले 'अपार्टमेंट' ऑब्जेक्ट का पुनर्निर्माण कर रहे हैं? ऐसा लगता है कि आप 'अपनी सूची से कक्ष' को हटा रहे हैं, या तो स्पष्ट रूप से या एक नई, खाली सूची बनाकर। – Jeremy

+0

मैंने अभी ऊपर अपना सेव-मेटोड जोड़ा है। जैसा कि आप देख सकते हैं कि मैं इसे स्टोर करने से पहले वास्तव में अपार्टमेंट ऑब्जेक्ट में कुछ भी नहीं करता .. – user829237

+0

'अपार्टमेंट' कहां से आता है? (साइड नोट: यह वर्तनी है * अपार्टमेंट * ;-) – Jeremy

उत्तर

3

यह वास्तव में सरल है। अपने बच्चों को दोबारा लगाने की जरूरत नहीं है, या अलग डीटीओ बनाओ।

यदि आप कभी भी बच्चों को जारी रखने के लिए नहीं जा रहे हैं तो बस अपने joincolumn एनोटेशन के लिए insertable = false, updatable = false जोड़ें। इस तरह:

@OneToMany 
@JoinColumn (name = "appartmentId", insertable = false, updatable = false) 
@Fetch(value = FetchMode.JOIN) 
private List<Room> room; 
+0

धन्यवाद! बस मैं क्या चाहता था। आसान, साफ और सीधे बिंदु पर! – user829237

+0

@ user829237: आपको एहसास है कि इसका मतलब है कि आप कभी भी कमरे की सूची में इसे जोड़कर किसी अपार्टमेंट में एक कमरा नहीं जोड़ सकते हैं, है ना? –

+0

हाँ, मुझे पता है, लेकिन अभी के लिए यह ... – user829237

-2

इसके बजाय, लगातार संस्थाओं का उपयोग कर DTOs उपयोग करने पर विचार के (आप उन्हें वेब पृष्ठों के मामले में एक पेज मॉडल कॉल कर सकते हैं)। वे आपको इच्छित जानकारी को चित्रित करने के लिए एक लचीलापन दे सकते हैं और इसे इच्छित प्रारूप में दिखा सकते हैं। लेकिन आपको इसके लिए भुगतान करना चाहिए - आप अपने सिस्टम में नए वर्ग जोड़ रहे हैं और आपको संस्थाओं को डीटीओ और पिछड़े में बदलने के लिए एक रास्ता तय करना होगा।

+0

कोई मैपिंग परत होने का कोई कारण नहीं है जब कोई पर्याप्त हो। – Jeremy

+0

मैंने मैपिंग परत के बारे में कुछ भी नहीं कहा। डीटीओ/वीओ उद्देश्य के आधार पर डेटा को चित्रित करने या भेजने के लिए एक परत है। आम तौर पर यह सब कुछ के लिए लगातार संस्थाओं के साथ पर्याप्त नहीं है, आपके पास कक्षाएं होनी चाहिए जो विशेष रूप से विशेष उद्देश्य के लिए जानकारी लेती हैं। –

+0

पर्याप्त मेला, लेकिन यह वास्तव में सवाल से संबंधित नहीं है। – Jeremy

1
  1. मैपिंग में आलसी लाने को अक्षम न करें। प्रदर्शन ट्यूनिंग के लिए fetching strategies का उपयोग करें।
  2. हाइबरनेट केवल एक अपार्टमेंट से कमरे हटा देगा यदि आप इसे उस अपार्टमेंट को सहेजने/अपडेट करने के लिए कहते हैं जिसमें इसमें कोई कमरा नहीं है।
+0

इसके लिए धन्यवाद! 1. बस लाने की रणनीति लागू की गई और यह बहुत अच्छा काम करता है। 2. जब सेव-एक्शन कहा जाता है, तो सभी कमरे अपार्टमेंट-ऑब्जेक्ट से चले जाते हैं। ऐसा लगता है कि कमरे की सूची को दोबारा बदलने के लिए डीबी को एक और कॉल करने के लिए इतना अनावश्यक लगता है, इसलिए यह अपार्टमेंट को बनाए रखने पर छूएगा। क्या यह वास्तव में ऐसा माना जाता है? – user829237

+0

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

+0

मैं जिस बिंदु को बनाने की कोशिश कर रहा हूं वह है: मैं बस अपार्टमेंट-ऑब्जेक्ट को अपडेट करना चाहता हूं। यह एक डीबी-कथन के बराबर है (अद्यतन अपार्टमेंट सेट .... आदि)। सभी बच्चों को लोड करने की आवश्यकता नहीं होनी चाहिए, सिर्फ इसलिए कि जब माता-पिता बिना छूटे रहें तो माता-पिता को बचाया जा सकता है .. – user829237

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