2010-05-27 13 views
5

हम पृष्ठभूमि में हाइबरनेट के साथ विकेट का उपयोग कर रहे हैं।लंबे समय तक चलने वाली बातचीत में विकेट और हाइबरनेट के बीच सुरक्षित रूप से जानकारी

आउट यूआई के हिस्से के रूप में अपडेट की गई जानकारी डेटाबेस पर वापस लिखे जाने से पहले हमारे पास एकाधिक अनुरोधों में फैले हुए लंबे समय तक चलने वाली बातचीत होती है।

पृथक वस्तुओं के साथ हाइबरनेट त्रुटियों से बचने के लिए अब हम सेवा परत से विकेट तक जानकारी स्थानांतरित करने के लिए मूल्य वस्तुओं का उपयोग कर रहे हैं।

हालांकि अब हम लगभग एक ही वस्तुओं की एक विस्फोट के साथ अंत:

उदा

  • उत्तर (मैप किया हाइबरनेट में सहेजा इकाई)
  • AnswerVO (अपरिवर्तनीय मूल्य वस्तु)
  • AnswerModel (एक सत्र डोमेन परिवर्तनशील सेम)
  • IModel लिपटे विकेट मॉडल
  • और आम तौर पर इस हो जाता है एक कंपाउंडप्रॉपर्टी मॉडल में लपेटा

यह नलसाजी तेजी से खराब हो जाती है जब अन्य वस्तुओं के संग्रह में शामिल होते हैं वस्तुओं

इसे व्यवस्थित करने का एक बेहतर तरीका होना चाहिए।

क्या कोई भी इसे कम कठिन बनाने के लिए युक्तियां साझा कर सकता है?

शायद मूल्य वस्तुएं उत्परिवर्तनीय बना दें ताकि हम विकेट में सीपेट बैकिंग बीन की आवश्यकता को हटा सकें?

इकाई सेम का उपयोग करें, लेकिन पूरी तरह से मृत-निश्चित करें कि वे हाइबरनेट से अलग हैं। (कहना आसान है करना मुश्किल)?

कुछ अन्य चाल या पैटर्न?

उत्तर

2

सामान्य समाधान "पैटर्न" देखने में खुला सत्र होगा, उदाहरण के लिए देखें। osiv with wicket

मैं OSIV के साथ कोई अच्छा अनुभव होते हैं, इसलिए मैं नहीं बल्कि वसंत से व्यवसाय या सेवा परत

+0

यह मेरी वर्तमान आंत भावना को "मजबूत" सेवा परत बनाने की पुष्टि करता है जो किसी भी हाइबरनेट प्रभाव से बचने की अनुमति देता है। आपके विस्तृत उत्तर के लिए –

3

उपयोग OpenSessionInViewFilter में जीयूआई परत नीचे लेनदेन सीमाएं निर्धारित करने की सलाह और चालाक योजना बनाई डेटा पुनर्प्राप्ति के साथ कुख्यात lazyInitializationException का समाधान। यह प्रति-अनुरोध हाइबरनेट सत्र बनाने में आपकी सहायता करेगा। हालांकि, यह केवल पढ़ने-योग्य सत्र खोलता है। अपनी इकाई सेम में कोई भी लेखन ऑपरेशन करने के लिए, मैं एक हाइबरनेट लेनदेन शुरू करने की सिफारिश करता हूं (आप इस के लिए वसंत से TransactionTemplate का उपयोग कर सकते हैं)। एक लेखन ऑपरेशन करने के लिए अन्य विधियां हैं, लेकिन मुझे पता चला कि यह मेरे लिए सबसे आसान था।

अब, अपने सेम को साफ करने के लिए, यहाँ है कि मैं क्या

  1. केवल इकाई सेम है
  2. आप राज्यविहीन जाना चाहते हैं, केवल सत्र में इकाई सेम के प्रमुख बचाने के लिए और फिर से लोड करते है आपके बहु-अनुरोध वार्तालाप में प्रत्येक अनुरोध पर बीन
  3. राज्यव्यापी बने रहने के लिए थोड़ा ट्रिकर है।आपको से पहले अपनी इकाई बीन को अलग करने की आवश्यकता है, बीन्स आपके सत्र स्टोर में बने रहेंगे, और बाद के अनुरोधों के दौरान आपको इसे फिर से संलग्न करने की आवश्यकता होगी। स्वाभाविक रूप से, अगर किसी ने पृष्ठभूमि में इकाई को अद्यतन किया है, तो आपको अपने आवेदन में इससे निपटना होगा (यानी उपयोगकर्ता को सूचित करना कि "डेटाबेस को बाहरी रूप से संशोधित किया गया है, आदि")।

मैं ऊपर (2) के साथ जाऊंगा क्योंकि यह बहुत आसान है और ज्यादातर मामलों पर काम करेगा। इसकी अनुशंसा नहीं की जाती है जब आपके लगातार बीन्स दो अलग-अलग सत्रों द्वारा संशोधित किए जाते हैं क्योंकि आप पिछले अपडेट ओवरराइड करना समाप्त कर देंगे।

हाइबरनेट में some documentation on dealing with detached objects है।

+0

धन्यवाद। मैंने ट्रांज़ेक्शन टेम्पलेट का उपयोग नहीं किया था, और मुझे पूरा यकीन है कि यह विशेष रूप से अजीब और हमेशा लौटने वाली समस्या में मदद करने जा रहा है। दुर्भाग्यवश हम विकल्प 3 में समाप्त हुए जहां डेटा प्रविष्टि एकाधिक अनुरोधों पर होती है जिसे 'सहेजा' या 'रद्द' किया जा सकता है। सबसे बुरा हिस्सा यह है कि काम करने का यह तरीका उपयोगकर्ताओं की आवश्यकता नहीं है (हालांकि वे इसके लिए पूछते हैं) क्योंकि यह एक ही समय में एक ही संस्था पर अलग-अलग स्थानों से अलग-अलग लोगों के साथ उपयोग किया जाता है और वास्तविक समय अपडेट की आवश्यकता होती है, न कि राज्य बातचीत की शुरुआत। –

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