2012-08-28 13 views
21

पर अपग्रेड करना मैं अपनी परियोजना को हाइबरनेट 3.0 से हाइबरनेट 4.1.6 में अपग्रेड कर रहा हूं। (और हम वर्तमान में वसंत 3.1 का उपयोग कर रहे हैं)हाइबरनेट 4.1 और "कुख्यात" HibernateTemplate

मैंने कई लेखों में और हाइबरनेट टेम्पलेट प्रलेखन में पढ़ा है, क्योंकि संस्करण 4.0 हाइबरनेट टेम्पलेट समर्थित नहीं है और मुझे सत्र प्राप्त करने के लिए sessionFactory.getCurrentSession() पर कॉल करने के साथ इसका उपयोग बदलना चाहिए।

चूंकि यह प्रोजेक्ट हाइबरनेट के पुराने संस्करण के साथ शुरू किया गया था, जहां HibernateTemplate का उपयोग प्रोत्साहित किया गया था, वर्तमान में हमारे पास हमारे प्रोजेक्ट में HibernateTemplate का 124 उपयोग है। मुझे डर है कि इन सभी घटनाओं को sessionFactory.getCurrentSession() के साथ बदलकर हमारे प्रोजेक्ट में रिग्रेशन बग डालें। इसके अलावा, ऐसे कुछ स्थान हैं जहां HibernateTemplate गैर-लेनदेन संदर्भ में उपयोग किया गया था, जहां कोई 'वर्तमान' सत्र नहीं है। मुझे उन मामलों में क्या करना चाहिए? एक नया सत्र खोलें और इसे स्वयं बंद करें (बंद करें)? ऐसा नहीं था जब मैंने HibernateTemplate का उपयोग किया था।

क्या आपके पास इन मुद्दों को हल करने में कुछ अच्छी रणनीति है?

धन्यवाद।

प्रासंगिक पढ़ने:

  1. Hibernate Vs. Spring - HibernateTemplate history
  2. Hibernate Core Migration Guide
  3. MIGRATING TO SPRING 3.1 AND HIBERNATE 4.1
  4. org.springframework.orm.hibernate3.HibernateTemplate
+2

अभी भी अच्छे पढ़ने का जवाब देने में योगदान नहीं है http://blog.springsource.com/2007/06/26/so-should-you-still-use-springs-hibernatetemplate-andor-jpatemplate/ – xyz

+1

भी प्रासंगिक हो सकता है: https://community.jboss.org/wiki/SessionsAndTransactions – yair

उत्तर

11

ठीक है, तो मैंने वास्तव में ऐसा किया है, मुझे नहीं पता कि यह इस समस्या का सबसे अच्छा समाधान है, लेकिन हमारी परिस्थितियों में, और जब से मैं सबसे स्थानीय समाधान की तलाश में था, तो यह मेरे लिए सबसे अच्छा लग रहा था ।

मैंने springframework.orm.hibernate3.HibernateTemplate को बढ़ाया है और एक नया MyHibernateTemplate बनाया है। नई टेम्पलेट की मुख्य भूमिका doExecute विधि को ओवरराइड करना है कि अधिकांश hibernate3.HibernateTemplate अंततः आगे बढ़ता है, और पुराने सत्र FactoryUtils (जैसे isessionTransactional और applyTransactionTimeout) द्वारा प्रदान की गई कुछ कार्यक्षमताओं को भी प्रदान करता है।

नया doExecute पुराने के तर्क को दोहराता है, लेकिन सत्र के लिए सत्र FactoryUtils.getNewSession की बजाय इसे पहले एक खुले सत्र को देखने का प्रयास करें सत्र Factory()।getCurrentSession():

boolean newSessionOpened = false; 
Session session; 

if (enforceNewSession){ 
    session = SessionFactoryUtils.openSession(getSessionFactory()); 
    newSessionOpened = true; 
} else { 
    try { 
     // look for an open session 
     session = getSessionFactory().getCurrentSession(); 
    } 
    catch (HibernateException ex) { 
     try { 
      // if there isn't an open session, open one yourself 
      session = getSessionFactory().openSession(); 
      newSessionOpened = true; 
     } catch (HibernateException e) { 
      throw new DataAccessResourceFailureException("Could not open Hibernate Session", ex); 
     } 
    } 
} 

// is the open session, is a session in a current transaction? 
boolean existingTransaction = (!enforceNewSession && 
     (!isAllowCreate() || isSessionTransactional(session, getSessionFactory()))); 

तुम बस मैन्युअल रूप से इस सत्र को बंद करने की जरूरत है:

finally { 
    // if session was used in an existing transaction restore old settings 
    if (existingTransaction) { 
     //logger.debug("Not closing pre-bound Hibernate Session after HibernateTemplate"); 
     disableFilters(session); 
     if (previousFlushMode != null) { 
      session.setFlushMode(previousFlushMode); 
     } 
    } 
    // if not and a new session was opened close it 
    else { 
     // Never use deferred close for an explicitly new Session. 
     if (newSessionOpened) { 
      SessionFactoryUtils.closeSession(session); 
      //_log.info("Closing opened Hibernate session"); 
     } 
    } 

मैं इस सवाल का जवाब कम रखने की कोशिश कर रहा हूँ, लेकिन मैं इस समस्या के बारे में अधिक विस्तार से बता सकते हैं कि क्या कोई सवाल कर रहे हैं।

+1

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

2

चेक बाहर this section डॉक्स में। यह कहता है कि SessionFactory.getCurrentSession() प्लग करने योग्य है और ThreadLocalSessionContext कार्यान्वयन है जो जेटीए लेनदेन की बजाय ThreadLocal में 'वर्तमान सत्र' रखता है। ThreadLocalSessionContext उस सत्र से बनाए गए हाइबरनेट लेनदेन के अंत में सत्र को भी बंद कर देगा, इसलिए आपको Session स्वयं को बंद करने के बारे में चिंता करने की आवश्यकता नहीं है।

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

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