com.gisgraphy.domain.repository.GenericDao.java Source code

Java tutorial

Introduction

Here is the source code for com.gisgraphy.domain.repository.GenericDao.java

Source

/*******************************************************************************
 *   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;

    }

}