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