2010-09-20 16 views
5

हमें हमारी परियोजना पर एक आवश्यकता है, जहां हमें आवेदन में कुछ इकाइयों में किए गए परिवर्तनों के इतिहास को बनाए रखने की आवश्यकता है। एप्लिकेशन स्ट्रेट्स, स्प्रिंग और हाइबरनेट पर आधारित एक जावा वेब ऐप है। इस मामले में किस प्रकार के दृष्टिकोण का इस्तेमाल किया गया है?जावा वेब अनुप्रयोग में लॉगिंग इकाई परिवर्तन

  • संबंधित तालिकाओं पर ट्रिगर्स एक विचार है लेकिन वे आसानी से बनाए रखने योग्य नहीं हैं? और शायद वे लेनदेन का हिस्सा नहीं बनना चाहिए (अगर ट्रिगर विफल हो जाते हैं तो ठीक है, लेकिन इकाई अद्यतन लेनदेन विफल नहीं होना चाहिए)।
  • इसके लिए एओपी का उपयोग एक क्रॉस-कटिंग चिंता के बाद करें, लेकिन वास्तव में दानेदार होना चाहिए, क्योंकि इकाई में परिवर्तन होने पर केवल मूल्यों को कैप्चर करना है। (सभी संपादनों में उनके संबंधित विभिन्न तरीकों नहीं हैं ... एक ही जावा विधि में कई संपादन होते हैं)।
  • हाइबरनेट ईवेंट श्रोताओं का उपयोग करें।

क्या इस तरह की गतिविधि करने के लिए कोई और दृष्टिकोण है?

उत्तर

3

क्योंकि तुमने कहा

सभी संपादन उनकी संगत के लिए विभिन्न तरीकों की जरूरत नहीं है ... कई संपादन एक भी जावा विधि में भी हो

अपने विधि बस के रूप में एक तर्क प्राप्त भले ही पैरामीटर और आप अपने रिश्तों को पुनः प्राप्त कर सकते हैं, एओपी अभी भी एक अच्छा विचार हो सकता है। मैं दृढ़ता से सलाह आप को देखने के लिए इस nice article

हाइबरनेट प्रलेखन खुद कहते हैं:

हाइबरनेट इंटरसेप्टर आवेदन का निरीक्षण किया और/या इससे पहले कि यह, सहेजा जाता है अद्यतन, नष्ट कर दिया या भरी हुई एक लगातार ऑब्जेक्ट के गुणों में हेरफेर करने की अनुमति देता है । इसके लिए एक संभावित उपयोग ऑडिटिंग जानकारी ट्रैक करना है।

लेकिन यह भी कहते हैं

सुनिश्चित करें कि आप, sessionspecific राज्यों एकत्र नहीं करते के बाद से कई सत्रों आप एक स्प्रिंग कामयाब लेन-देन का उपयोग करते हैं इस इंटरसेप्टर संभावित समवर्ती

का उपयोग करेगा , आप sessionFactory.getCurrentSession() का उपयोग कर वर्तमान थ्रेड पर सत्रित सत्र प्राप्त कर सकते हैं;

public boolean onSave(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) { 
    if(entity instanceof SomeEntity) { 
     Session session = sessionFactory.getCurrentSession(); 

देखें getCurrentSession() प्रलेखन

यदि नहीं, तो आप एक वैश्विक इंटरसेप्टर (SessionFactory से जुड़ी) के एक स्थानीय हाइबरनेट इंटरसेप्टर (खोला सत्र से जुड़ी) बनाना चाहिए बजाय, और उसके बाद की स्थापना की अपनी सत्र

AuditableInterceptor interceptor = new AuditableInterceptor() 
Session session = sessionFactory.openSession(interceptor); 

/** 
    * do it before processing anything if you use local interceptor 
    */ 
interceptor.setSession(session); 

ट्रिगर के बारे में, यह डीबी प्रशासन जैसे अन्य मुद्दों पर निर्भर करता है (यदि आप डीबी प्रशासन पहुंच है। यदि नहीं, डीबीए से बात करें आपका सर्वश्रेष्ठ दांव है)।

+0

जानकारी आर्थर के लिए धन्यवाद। सरल कार्यान्वयन के लिए मैं हाइबरनेट इवेंट श्रोता को विस्तारित करने की कोशिश कर रहा हूं। सामान्य प्रयोजन स्पष्टीकरण के लिए –

+0

+1। – Bozho

+0

+1 बोझो ने कहा –

4

JBoss Envers ऑडिशन और वर्जनिंग का समर्थन करता है - एक नज़र डालें।

+0

दिलचस्प (+1) क्या आप इसे सफलतापूर्वक उपयोग करते हैं ?? –

+0

@ अरहतूर - नहीं, हां। लेकिन मैं उन लोगों को जानता हूं जो इसका इस्तेमाल करते हैं और कहते हैं कि यह अच्छा है :) – Bozho

+0

और +1 भी। Envers यहाँ अच्छी तरह फिट बैठता है। –

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