2009-12-22 11 views
6

सबसे पहले बुनियादी तथ्यों को लागू: जावा webapp, स्प्रिंग, हाइबरनेट, MySQL।एक हाइबरनेट आधारित अनुप्रयोग के लिए एक डेटा इतिहास/संस्करण समाधान (एक मोड़ के साथ)

स्थिति है कि मैं जैसे की एक जटिल ऑब्जेक्ट मॉडल है एक कार। यह कई ऑब्जेक्ट्स (इंजन, टायर, ...) से बना है जिसमें कई से एक और उनके बीच कई संबंध हैं।

अब कई कारें हैं, और हर कोई और फिर कोई कार की जांच करता है और निरीक्षण के की रिपोर्ट करता है। रिपोर्ट है कि कार कई हिस्सों को संदर्भित करता है उनके गुणों आदि प्रदर्शित

अब तक सिस्टम को अपडेट करने के लिए कार के और अपने हिस्से 'गुण एक बार वे प्रणाली में खिलाया गया है क्षमता का समर्थन नहीं किया। इसका मतलब है कि यदि चेसिस या टायरों की संख्या बदल दी गई है, तो पुरानी रिपोर्ट इस बदलाव को प्रतिबिंबित करेगी जो हम नहीं चाहते हैं।

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

मैं "Slowly changing dimensions" देख रहा हूं और ऐसा लगता है कि कार और उसके हिस्सों का संस्करण टाइप 6 दृष्टिकोण के साथ किया जा सकता है।

बात (मोड़) है कि मैं मुसीबत पता लगाना (शायद अपने सीमित हाइबरनेट अनुभव के कारण) हो रही है यह है:

मैं हाइबरनेट के साथ मेरी रिपोर्ट उदाहरणों कैसे इकट्ठा कर सकते हैं, ताकि वे का उल्लेख कार के प्रत्येक हिस्से के सही संस्करण? रिपोर्टों की तारीख है और कार भागों के प्रत्येक संस्करण में दिनांक सीमाएं होती हैं जब वे मान्य होते हैं, इसलिए मुझे लगता है कि मैं इसे कुछ जटिल एचक्यूएल/एसक्यूएल के साथ कर सकता हूं। लेकिन क्या हाइबरनेट के साथ ऐसा करने का कोई आसान, अधिक स्वचालित तरीका है?

उत्तर

1

मैं हाइबरनेट साथ दृष्टिकोण आप का सुझाव (प्रकार 6) का उपयोग किया है और यह मेरे लिए ठीक काम किया। रिपोर्ट के लिए प्रश्न थोड़ा और जटिल हो गए थे, लेकिन इतना नहीं, क्योंकि सभी प्रश्नों के लिए एक ही खंड की आवश्यकता थी (उदाहरण के लिए 'और: रिपोर्टटाइम> = x.startTime और (: रिपोर्टटाइम < x.endTime या x.endTime शून्य है) ')।

मैं एक अंतरफलक और एक आधार वर्ग कि 2 गुण (जैसे STARTTIME और ENDTIME) के साथ इस दृष्टिकोण का समर्थन संस्थाओं के लिए (इंटरफेस सिर्फ अस्थायी उप वर्गों जिसकी मूल अस्थायी नहीं था के लिए की जरूरत थी), और काम कर DAOs के लिए एक आधार वर्ग बनाया अस्थायी संस्थाओं के साथ जिनकी कार्यक्षमता अक्सर आवश्यक थी। चीज़ें है कि मैं इस आधार डीएओ में डाल:

  1. उदाहरणों को जिसका STARTTIME परिवर्तन की रोकथाम पारित किया था (यानी ENDTIME भरने) यदि एक नया पिछले उदाहरण
  2. स्वचालित रूप से बंद करने (ENDTIME एक भविष्य समय के लिए सेटिंग को छोड़कर) उदाहरण जोड़ा गया था (उदाहरण के लिए oldInstance.endTime = newInstance।स्टार्टटाइम)
  3. एचक्यूएल प्रश्नों के लिए क्वेरी के समय मौजूदा इकाइयों का चयन करने के लिए मानक खंड जोड़ना।
  4. यदि किसी कारण से दो वैध उदाहरणों/संस्करणों समय में एक पल में पाए गए डुप्लिकेट के साथ काम (मैं 'STARTTIME desc' के आधार पर अपने प्रश्नों का आदेश दिया और केवल पहले लौटे ले लिया)

ही हिस्सा है जहाँ मैं यह वास्तव में गन्दा डेटाबेस के खिलाफ चल रहे सादे एसक्यूएल प्रश्नों के साथ काम कर रहा था, जहां अतिरिक्त तालिकाओं को शामिल टेबल पर या उप-चयन में आवश्यक था।

+0

यह हमारे द्वारा उठाए गए दृष्टिकोण से काफी अधिक था। – Janne

1

MySQL triggers का समर्थन करता है। एक ट्रिगर सेटअप करें ताकि जब भी कोई पंक्ति बदल दी जाए, तो ट्रिगर एक टाइमस्टैम्प के साथ पंक्ति को "संग्रह" तालिका में कॉपी करता है। इस तरह, सभी पिछले डेटा संस्करण बनाए रखा जाता है, जो रिपोर्ट के खिलाफ चलाया जा सकता है।

6

आप अपने वस्तुओं वर्ज़निंग के लिए JBoss envers पर एक नज़र ले जा सकते हैं। मुझे यकीन नहीं है कि यह आपके उपयोग के लिए उपयुक्त है, लेकिन इसे एक नज़र डालें।

+0

टिप के लिए धन्यवाद। Envers बहुत उपयोगी लग रहा है लेकिन स्थिति काफी फिट नहीं था। यह जानना अच्छा है कि वैसे भी मौजूद है। – Janne

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