Step1: Create custom HibernateTemplate Class extending org.springframework.orm.hibernate3.HibernateTemplate .
 
 
  
package com.solverelogistics.edi.dao;
import java.sql.SQLException;
import org.hibernate.Criteria;
import org.hibernate.Filter;
import org.hibernate.FlushMode;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.SessionFactory;
import org.springframework.dao.DataAccessException;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.orm.hibernate4.SessionFactoryUtils;
import org.springframework.orm.hibernate4.SessionHolder;
import org.springframework.transaction.support.TransactionSynchronizationManager;
import org.springframework.util.Assert;
public class EDIHibernateTemplate extends HibernateTemplate {
 public EDIHibernateTemplate(SessionFactory sessionFactory) {
  super(sessionFactory);
 }
 public EDIHibernateTemplate(){
 }
 protected <T> T doExecute(HibernateCallback<T> action,
   boolean enforceNewSession, boolean enforceNativeSession)
   throws DataAccessException {
  Assert.notNull(action, "Callback object must not be null");
  org.hibernate.Session session = SessionFactoryUtils
    .openSession(getSessionFactory());
  SessionHolder sessionHolder = (SessionHolder) TransactionSynchronizationManager
    .getResource(getSessionFactory());
  boolean existingTransaction = (!enforceNewSession)
    && ((!isAllowCreate()) || (sessionHolder != null && sessionHolder
      .getSession() != null));
  if (existingTransaction) {
   this.logger
     .debug("Found thread-bound Session for HibernateTemplate");
  }
  FlushMode previousFlushMode = null;
  try {
   previousFlushMode = applyFlushMode(session, existingTransaction);
   enableFilters(session);
   org.hibernate.Session sessionToExpose = (enforceNativeSession)
     || (isExposeNativeSession()) ? session
     : createSessionProxy(session);
   T result = action.doInHibernate(sessionToExpose);
   flushIfNecessary(session, existingTransaction);
   T localObject2 = result;
   return localObject2;
  } catch (HibernateException ex) {
   ex.printStackTrace();
   throw convertHibernateAccessException(ex);
  } catch (SQLException ex) {
   ex.printStackTrace();
   throw convertJdbcAccessException(ex);
  } catch (RuntimeException ex) {
   ex.printStackTrace();
   throw ex;
  } finally {
   if (existingTransaction) {
    this.logger
      .debug("Not closing pre-bound Hibernate Session after HibernateTemplate");
    disableFilters(session);
    if (previousFlushMode != null) {
     session.setFlushMode(previousFlushMode);
    }
   } else {
    SessionFactoryUtils.closeSession(session);
   }
  }
 }
 protected org.hibernate.Session getSession() {
  return SessionFactoryUtils.openSession(getSessionFactory());
 }
 public Filter enableFilter(String filterName) throws IllegalStateException {
  org.hibernate.Session session = SessionFactoryUtils
    .openSession(getSessionFactory());
  Filter filter = session.getEnabledFilter(filterName);
  if (filter == null) {
   filter = session.enableFilter(filterName);
  }
  return filter;
 }
 protected void prepareQuery(Query queryObject) {
  if (isCacheQueries()) {
   queryObject.setCacheable(true);
   if (getQueryCacheRegion() != null) {
    queryObject.setCacheRegion(getQueryCacheRegion());
   }
  }
  if (getFetchSize() > 0) {
   queryObject.setFetchSize(getFetchSize());
  }
  if (getMaxResults() > 0) {
   queryObject.setMaxResults(getMaxResults());
  }
  applyTransactionTimeout(queryObject, getSessionFactory());
 }
 protected void prepareCriteria(Criteria criteria) {
  if (isCacheQueries()) {
   criteria.setCacheable(true);
   if (getQueryCacheRegion() != null) {
    criteria.setCacheRegion(getQueryCacheRegion());
   }
  }
  if (getFetchSize() > 0) {
   criteria.setFetchSize(getFetchSize());
  }
  if (getMaxResults() > 0) {
   criteria.setMaxResults(getMaxResults());
  }
  applyTransactionTimeout(criteria, getSessionFactory());
 }
 public static void applyTransactionTimeout(Query query,
   SessionFactory sessionFactory) {
  Assert.notNull(query, "No Query object specified");
  if (sessionFactory != null) {
   SessionHolder sessionHolder = (SessionHolder) TransactionSynchronizationManager
     .getResource(sessionFactory);
   if ((sessionHolder != null) && (sessionHolder.hasTimeout()))
    query.setTimeout(sessionHolder.getTimeToLiveInSeconds());
  }
 }
 public static void applyTransactionTimeout(Criteria criteria,
   SessionFactory sessionFactory) {
  Assert.notNull(criteria, "No Criteria object specified");
  SessionHolder sessionHolder = (SessionHolder) TransactionSynchronizationManager
    .getResource(sessionFactory);
  if ((sessionHolder != null) && (sessionHolder.hasTimeout()))
   criteria.setTimeout(sessionHolder.getTimeToLiveInSeconds());
 }
}
Step2:  Create custom HibernateDAOSupport class.
package com.solverelogistics.edi.dao;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.jdbc.Work;
import org.springframework.dao.DataAccessException;
import org.springframework.dao.DataAccessResourceFailureException;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.orm.hibernate4.SessionFactoryUtils;
public class EDIHibernateDaoSupport {
 private EDIHibernateTemplate hibernateTemplate;
 public final void setSessionFactory(SessionFactory sessionFactory) {
  if ((this.hibernateTemplate == null)
    || (sessionFactory != this.hibernateTemplate
      .getSessionFactory()))
   this.hibernateTemplate = createHibernateTemplate(sessionFactory);
 }
 protected EDIHibernateTemplate createHibernateTemplate(
   SessionFactory sessionFactory) {
  return new EDIHibernateTemplate(sessionFactory);
 }
 public final SessionFactory getSessionFactory() {
  return this.hibernateTemplate != null ? this.hibernateTemplate
    .getSessionFactory() : null;
 }
 public final void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
  this.hibernateTemplate = (EDIHibernateTemplate)hibernateTemplate;
 }
 public final HibernateTemplate getHibernateTemplate() {
  return this.hibernateTemplate;
 }
 protected final void checkDaoConfig() {
  if (this.hibernateTemplate == null)
   throw new IllegalArgumentException(
     "'sessionFactory' or 'hibernateTemplate' is required");
 }
 protected final Session getSession()
   throws DataAccessResourceFailureException, IllegalStateException {
  return getSession(this.hibernateTemplate.isAllowCreate());
 }
 protected final Session getSession(boolean allowCreate)
   throws DataAccessResourceFailureException, IllegalStateException {
  return SessionFactoryUtils.openSession(getSessionFactory());
 }
 protected final DataAccessException convertHibernateAccessException(
   HibernateException ex) {
  return this.hibernateTemplate.convertHibernateAccessException(ex);
 }
 protected final void releaseSession(Session session) {
  SessionFactoryUtils.closeSession(session);
 }
}
Step3: configure custom HibernateTemplate in context-srpring-hibernate.xml
<bean id="dataSource"
  class="org.springframework.jdbc.datasource.DriverManagerDataSource"
  p:driverClassName="#{databaseProperties['hibernate.connection.driver_class']}" p:url="#{databaseProperties['hibernate.connection.url']}"
  p:username="#{databaseProperties['hibernate.connection.username']}" p:password="#{databaseProperties['hibernate.connection.password']}" />
 <!-- Hibernate SessionFactory -->
 <bean id="sessionFactory"
  class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"
  p:dataSource-ref="dataSource">
  <property name="mappingResources">
   <list>
    <value>com/entities/xx1.hbm.xml</value>
    <value>com/entities/xx2.hbm.xml</value>
  </list>
  </property>
</bean>
 <bean id="hibernateTemplate" class=" com.solverelogistics.edi.dao.EDIHibernateTemplate">
  <property name="sessionFactory" ref="sessionFactory" />
  <property name="cacheQueries" value="true" />
  <property name="queryCacheRegion" value="querycache_artwork" />
 </bean>
 <!-- Transaction manager for a single Hibernate SessionFactory (alternative 
  to JTA) -->
 <bean id="transactionManager"
  class="org.springframework.orm.hibernate4.HibernateTransactionManager"
  p:sessionFactory-ref="sessionFactory">
 </bean>
 
No comments:
Post a Comment