2012-08-28 18 views
21

Yükseltme Projemizi Hazırda Bekletme 3.0'dan Hazırda Bekletme 4.1.6'ya yükseltiyorum. (Ve şu anda 3.1 bahar kullanıyoruz)Hazırda Bekletme 4.1 ve "rezil" HibernateTemplate

Birçok makalede ve HibernateTemplate belgelerinde okudum, sürüm 4.0'dan beri HibernateTemplate desteklenmiyor ve bunun yerine oturumu almak için sessionFactory.getCurrentSession() numaralı telefonu kullanmakla değiştirmem gerekiyor.

Bu proje, HibernateTemplate kullanımının teşvik edildiği, hazırda bekletme sürümünün eski sürümüyle başlatıldığı için, şu anda projemiz genelindekullanımımız var. Tüm bu oluşumları sessionFactory.getCurrentSession() ile değiştirmenin, projemize regresyon hataları ekleyebileceğinden korkuyorum. Ayrıca, HibernateTemplate'un 'mevcut' oturumun olmadığı işlem dışı bir bağlamda kullanıldığı bazı yerler vardır. Bu durumlarda ne yapmalıyım? Yeni bir oturum açın ve kendim hallet (kapat)? HibernateTemplate kullanıldığında durum böyle değildi.

Bu sorunları gideren iyi bir stratejiniz var mı?

Teşekkürler.

İlgili okuma: docs

  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

da ilgili olabilir hala iyi bir okuma http://blog.springsource.com/2007/06/26/so-should-you-still-use-springs-hibernatetemplate-andor-jpatemplate/ – xyz

+1

cevap katkıda Değil: https://community.jboss.org/wiki/SessionsAndTransactions – yair

cevap

11

Tamam, Yani aslında böyle yaptım, bu sorunun en iyi çözümü olup olmadığını bilmiyorum, ama bizim şartlarımız altında ve en yerelleştirilmiş çözümü aradığımdan beri bana göre en iyi görünüyordu. .

Springframework.orm.hibernate3.HibernateTemplate ürününü genişletip yeni bir MyHibernateTemplate oluşturdum. Yeni şablonun ana görevi, hibernate3.HibernateTemplate öğesinin çoğunun nihayetinde ortaya çıkan doExecute yöntemini geçersiz kılması ve ayrıca eski SessionFactoryUtils (isSessionTransactional ve applyTransactionTimeout gibi) tarafından sağlanan bazı işlevlerin sağlanmasıdır.

Yeni doExecute, eskinin mantığını çoğaltır, ancak oturum açmak için önce SessionFactoryUtils.getNewSession yerine getSessionFactory() açık oturumunu aramayı deneyin.Kısa Bu yanıt tutmak çalışıyorum ediyorum

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"); 
     } 
    } 

, ancak herhangi bir sorunuz varsa bu sorun hakkında daha fazla ayrıntı hale: 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()))); 

Sadece elle bu oturumu kapatmanız gerekir.

+1

Bu, HibernateTemplate ve arkadaşlarındaki işlevsellik nedeniyle zor bir sorundur. Bu gönderiyi bulmadan önce, anlattığınız yolla neredeyse aynı yola gittim, ancak genişletmek yerine HibernateTemplate'i klonladım. Bunun en iyi strateji olduğundan emin değilim. Hesaplamak için LOTS işlevinden vazgeçtim, sonuçta ortaya çıkan kodun kararlılığı konusunda endişelerim var. Bunun sizin için eski bir tarih olduğunu biliyorum, ancak stratejiniz hakkında daha fazla şey paylaşabiliyor musunuz ve sizin için nasıl paniklediniz? – nclark

2

atın this section. SessionFactory.getCurrentSession()'un takılabilir olduğunu ve bir 'JV işleminden ziyade' geçerli oturumu 'ThreadLocal içinde tutan bir ThreadLocalSessionContext uygulaması olduğunu söylüyor. ThreadLocalSessionContext ayrıca, o oturumdan oluşturulan hazırda bekletme işleminin sonunda oturumu da kapatacaktır, böylece Session'u kapama konusunda endişelenmenize gerek yoktur.

Regresyon hatalarının tanıtımıyla ilgili olarak, bir kitaplığı yükseltmek, özellikle de uygulamanızın hazırda bekletme gibi bir çekirdeği olduğu durumlarda, her zaman bu risklere sahip olacaktır. Verebileceğim tek tavsiye, test paketinizin yükseltmeden önce iyi kapsama sahip olmasını sağlamaktır. Sonuçta, test paketinizin işi budur - regresyon hatalarını yakalamak için.

İlgili konular