2010-11-30 17 views
5

के साथ ऐतिहासिक डेटा संग्रहीत करना यह ऐतिहासिक डेटा हैंडलिंग के बारे में एक समस्या है। मान लीजिए आप निम्न में से एक की तरह एक वर्ग MyClass है:जावा और हाइबरनेट

class MyClass { 
    String field1; 
    Integer field2; 
    Long field3; 

    getField1() {...} 
    setField1(String ...) {...} 

    ... 
} 

अब, लगता है मुझे MyClass की दुकान और पुराने डेटा पुनः प्राप्त करने में सक्षम बनाने की जरूरत है, यह करने के लिए सबसे अच्छा तरीका क्या है?
आवश्यकताएँ हैं भी हाइबरनेट के माध्यम से कक्षाएं जारी रहती है। और प्रति "इकाई" सबसे दो तालिकाओं पर है करने के लिए: केवल एक तालिका या "निरंतरता" वर्ग (एक जो इकाई जो समय के साथ विकसित का प्रतिनिधित्व करता है) (ऐतिहासिक डेटा के लिए और एक अन्य तालिका के रूप में यह सुझाव दिया है के लिए एक मेज here)
कृपया ध्यान दें कि मुझे फ़ील्ड के मानों के लिए मनमाने ढंग से वैध समय असाइन करने में सक्षम होना चाहिए।

वर्ग की तरह एक अंतरफलक होना चाहिए:

class MyClass { 
    // how to store the fields???? 

    getField1At(Instant i) {...} 
    setField1At(Instant i, String ...) {...} 

    ... 
} 

मैं वर्तमान में JTemporal पुस्तकालय का उपयोग कर रहा है, और यह एक TemporalAttribute<T> वर्ग है, जो एक मानचित्र की तरह है: आप T myAttr.get(Instant i) जैसे काम कर सकें पाने के लिए Instant i पर myAttr का संस्करण। मुझे पता है कि हाइबरनेट के साथ एक तालिका में टेम्पोरल एट्रिब्यूट कैसे जारी रखना है (यह आसान है: मैं टेम्पोरलएट्रिब्यूट द्वारा उपयोग किए गए सॉर्टेडैप को जारी रखता हूं और आपको स्टार्ट और एंड वैध समय और विशेषता का मान) के साथ एक टेबल मिलता है।
असली समस्या यह है कि यहां हमारे पास कई विशेषताएं हैं।
मेरे पास एक समाधान है लेकिन यह स्पष्ट नहीं है, और मैं आपके विचार सुनना चाहता हूं।

उत्तर

0

आप अपने डोमेन क्लास में संस्करण संख्या जोड़ कर ऐसा कुछ कर सकते हैं। मैंने ऐसा कुछ किया जहां आईडी एक डीबी असाइन नंबर और संस्करण संख्या के बीच एक समग्र थी, लेकिन मैं इसके खिलाफ सलाह दूंगा। एक सामान्य सरोगेट कुंजी का उपयोग करें, और यदि आप वास्तव में चाहते हैं, तो [आईडी, संस्करण] एक प्राकृतिक कुंजी टुपल करें।

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

आप कोड उस संस्करण का प्रबंधन करता है की अखंडता को सुनिश्चित करने के लिए सेवा परीक्षण का एक बहुत लिखना चाहिए।

5

आपका परियोजना मुझे Hibernate Envers की याद दिलाता है।

एनवर्स प्रोजेक्ट का लक्ष्य लगातार लगातार कक्षाओं की लेखा परीक्षा को सक्षम करना है। सभी आपको क्या करना है कि आपके लगातार वर्ग या उसके संपत्तियों की कुछ व्याख्या करते हैं, कि आप @Audited साथ ऑडिट करने के लिए, चाहते हैं। प्रत्येक लेखापरीक्षित इकाई के लिए, एक तालिका बनाई जाएगी, जो इकाई में किए गए परिवर्तनों का इतिहास रखेगी। इसके बाद आप पुनर्प्राप्त कर सकते हैं और प्रयास के बिना ऐतिहासिक डेटा पूछ सकते हैं।

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

इस decouples इकाइयों और संशोधन डेटा (डेटाबेस में और अपने कोड में) के लिए हाइबरनेट Envers का उपयोग करना।

+0

मैंने मैनुअल को मैन्युअल पढ़ा है, लेकिन मैं यह समझने में सक्षम नहीं था कि एक संशोधन और समाप्ति वैधता समय में संशोधन करना संभव है, और Enver को स्वयं को असाइन करने दें। मुझे यही चाहिए, क्योंकि मुझे केवल संशोधन को स्टोर करने की आवश्यकता नहीं है, बल्कि यह भी तय करने के लिए कि संशोधन कब वैध था। – cdarwin

+0

आप अपनी खुद की संशोधन इकाई को कार्यान्वित कर सकते हैं (http://docs.jboss.org/envers/docs/index.html#revisionlog देखें) और कस्टम टाइमस्टैम्प जोड़ें। क्या आप यही खोज रहे हैं? –

+0

जहां तक ​​मैंने देखा है, यदि मैं अपनी वैधता तिथियों को अतिरिक्त संशोधन डेटा में डालता हूं तो मैं उन्हें एक क्वेरी क्वेरी में निर्दिष्ट नहीं कर सकता (मुझे इस बारे में पूरी तरह से यकीन नहीं है)। मैं Envers (http://jboss.org/envers/downloads/envers_seam_demo.zip) के साथ उपलब्ध बिटमैपोरल डेटाबेस के कोड के माध्यम से खुदाई कर रहा हूं, और मुझे लगता है कि फ़ील्ड्स "सामान्य" वर्ग से संबंधित हैं, भले ही नमूना कोड काफी पुराना है हालांकि एक बड़ी समस्या है (आपके लिंक से उद्धरण): "जैसा कि संशोधन वैश्विक हैं, आपके पास अधिकतम एक संशोधन इकाई हो सकती है" - जबकि मुझे "स्थानीय" डेटा की आवश्यकता होती है, यानी एक विशिष्ट इकाई – cdarwin

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