Java tutorial
/******************************************************************************* * Gisgraphy Project * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA * * Copyright 2008 Gisgraphy project * David Masclet <davidmasclet@gisgraphy.com> * * *******************************************************************************/ /** * */ package com.gisgraphy.domain.repository; import java.io.Serializable; import java.util.ArrayList; import java.util.List; import javax.persistence.PersistenceException; import org.hibernate.FlushMode; import org.hibernate.HibernateException; import org.hibernate.ObjectNotFoundException; import org.hibernate.Query; import org.hibernate.Session; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.dao.DataAccessResourceFailureException; import org.springframework.orm.hibernate3.HibernateCallback; import org.springframework.orm.hibernate3.support.HibernateDaoSupport; import org.springframework.util.Assert; /** * A generic dao That implements basic functions with java 5.0 generics * * @author <a href="mailto:david.masclet@gisgraphy.com">David Masclet</a> */ public class GenericDao<T, PK extends Serializable> extends HibernateDaoSupport implements IDao<T, PK> { private Logger log = LoggerFactory.getLogger(this.getClass()); protected Class<T> persistentClass; /* * (non-Javadoc) * * @see com.gisgraphy.domain.repository.IDao#getPersistenceClass() */ public Class<T> getPersistenceClass() { return persistentClass; } /** * constructor * * @param persistentClass * The specified Class for the GenericDao */ public GenericDao(final Class<T> persistentClass) { this.persistentClass = persistentClass; } /* * (non-Javadoc) * * @see com.gisgraphy.domain.repository.Idao#flushAndClear() */ public void flushAndClear() { this.getHibernateTemplate().execute(new HibernateCallback() { public Object doInHibernate(Session session) throws PersistenceException { session.flush(); session.clear(); return null; } }); } /* * (non-Javadoc) * * @see com.gisgraphy.domain.repository.Idao#remove(java.io.Serializable) */ public void remove(final T o) { Assert.notNull(o, "Can not remove a null object"); this.getHibernateTemplate().delete(o); } /* * (non-Javadoc) * * @see com.gisgraphy.domain.repository.Idao#save(java.lang.Object) */ @SuppressWarnings("unchecked") public T save(final T o) { Assert.notNull(o); this.getHibernateTemplate().saveOrUpdate(o); return o; } /* * (non-Javadoc) * * @see com.gisgraphy.domain.repository.IDao#setFlushMode(org.hibernate.FlushMode) */ public void setFlushMode(final FlushMode flushMode) { Assert.notNull(flushMode); this.getHibernateTemplate().execute(new HibernateCallback() { public Object doInHibernate(Session session) { session.setFlushMode(flushMode); return null; } }); } /* * (non-Javadoc) * * @see com.gisgraphy.domain.repository.IDao#get(java.io.Serializable) */ public T get(final PK id) { Assert.notNull(id, "Can not retrieve an Ogject with a null id"); T returnValue = null; try { returnValue = (T) this.getHibernateTemplate().get(persistentClass, id); } catch (Exception e) { log.info("could not retrieve object of type " + persistentClass.getSimpleName() + " with id " + id, e); } return returnValue; } /* * (non-Javadoc) * * @see com.gisgraphy.domain.repository.IDao#exists(java.io.Serializable) */ public boolean exists(PK id) { return get(id) != null; } /* * (non-Javadoc) * * @see com.gisgraphy.domain.repository.Idao#findAll() */ @SuppressWarnings("unchecked") public List<T> getAll() { List<T> returnValue = new ArrayList<T>(); try { return (List<T>) this.getHibernateTemplate().execute(new HibernateCallback() { public Object doInHibernate(Session session) throws PersistenceException { String queryString = "from " + persistentClass.getSimpleName(); Query qry = session.createQuery(queryString); qry.setCacheable(true); List<T> results = (List<T>) qry.list(); if (results == null) { results = new ArrayList<T>(); } return results; } }); } catch (DataAccessResourceFailureException e) { log.info("could not retrieve all object of type " + persistentClass.getName(), e); } catch (ObjectNotFoundException e) { log.info("could not retrieve object of type " + persistentClass.getName() + " with id ", e); } catch (HibernateException e) { log.info("could not retrieve all object of type " + persistentClass.getName(), e); } catch (IllegalStateException e) { log.info("could not retrieve all object of type " + persistentClass.getName(), e); } return returnValue; } /* * (non-Javadoc) * * @see com.gisgraphy.domain.repository.IDao#deleteAll(java.util.List) */ public void deleteAll(List<T> list) { Assert.notNull(list); getHibernateTemplate().deleteAll(list); } /* * (non-Javadoc) * * @see com.gisgraphy.domain.repository.IDao#count() */ public long count() { return ((Long) this.getHibernateTemplate().execute(new HibernateCallback() { public Object doInHibernate(Session session) throws PersistenceException { String queryString = "select count(*) from " + persistentClass.getSimpleName(); Query qry = session.createQuery(queryString); qry.setCacheable(true); Long result = (Long) qry.uniqueResult(); return result; } })).longValue(); } /* * (non-Javadoc) * * @see com.gisgraphy.domain.repository.IDao#getAllPaginate(int, int) */ @SuppressWarnings("unchecked") public List<T> getAllPaginate(final int from, final int maxResults) { return (List<T>) this.getHibernateTemplate().execute(new HibernateCallback() { public Object doInHibernate(Session session) throws PersistenceException { String queryString = "from " + persistentClass.getSimpleName() + " order by id"; //we order by id because we want to keep the same order query after query Query qry = session.createQuery(queryString); qry.setCacheable(true); if (maxResults > 0) { qry.setMaxResults(maxResults); } if (from >= 1) { qry.setFirstResult(from - 1); } List<T> results = (List<T>) qry.list(); if (results == null) { results = new ArrayList<T>(); } return results; } }); } /* * (non-Javadoc) * * @see com.gisgraphy.domain.repository.IDao#deleteAll() */ public int deleteAll() { int deleted = ((Integer) this.getHibernateTemplate().execute(new HibernateCallback() { public Object doInHibernate(Session session) throws PersistenceException { //TODO zipcodes and alternatename are not deleted in cascade String queryString = "DELETE " + persistentClass.getSimpleName(); Query qry = session.createQuery(queryString); Integer deleted = Integer.valueOf(qry.executeUpdate()); return deleted; } })).intValue(); return deleted; } }