July 06, 2012

Spring 3.1 Integration with Hibernate 4.14 : How to configure hibernate template?

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