BaseHibernateDAOImpl.java

package org.itracker.persistence.dao;

import org.hibernate.HibernateException;
import org.itracker.model.Entity;
import org.springframework.dao.InvalidDataAccessResourceUsageException;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import java.util.Date;

/**
 * Contains common behaviour to all hibernate factories
 *
 * @author rui silva
 */
public abstract class BaseHibernateDAOImpl<T extends Entity> extends HibernateDaoSupport
        implements BaseDAO<T> {

    /**
     *
     */
    public BaseHibernateDAOImpl() {
        super();
    }

    /**
     * insert a new entity.
     * create- and lastmodified-date is set with current time.
     *
     * @param entity - detached entity object
     */
    public void save(T entity) {
        if (null == entity) {
            throw new InvalidDataAccessResourceUsageException("entity must not be null");
        }
        try {
            Date createDate = new Date();
            entity.setCreateDate(createDate);
            entity.setLastModifiedDate(createDate);
            getSession().save(entity);
        } catch (HibernateException ex) {
            logger.debug("save: caught HibernateException, call to convertHibernateException", ex);
            throw convertHibernateAccessException(ex);
        }
    }

    /**
     * inserts a new detached entity or updates if it already exists.
     * create- and update-date are set automatically.
     *
     * @param entity - entity object to be inserted or updated
     */
    public void saveOrUpdate(T entity) {
        if (null == entity) {
            throw new InvalidDataAccessResourceUsageException("entity must not be null");
        }

        try {
            if (null == entity.getCreateDate()) {
                entity.setCreateDate(new Date());
                entity.setLastModifiedDate(entity.getCreateDate());
            } else {
                entity.setLastModifiedDate(new Date());
            }
            getSession().saveOrUpdate(entity);
        } catch (HibernateException ex) {
            logger.debug("saveOrUpdate: caught HibernateException, call to convertHibernateException", ex);
            throw convertHibernateAccessException(ex);
        }
    }

    public void delete(T entity) {
        if (null == entity) {
            throw new InvalidDataAccessResourceUsageException("entity must not be null");
        }
        try {
            getSession().delete(entity);
            getSession().flush();
        } catch (HibernateException ex) {
            logger.debug("delete: caught HibernateException, call to convertHibernateException", ex);
            throw convertHibernateAccessException(ex);
        }
    }

    public void detach(T entity) {
        if (null == entity) {
            throw new InvalidDataAccessResourceUsageException("entity must not be null");
        }
        try {
            getSession().evict(entity);
        } catch (HibernateException ex) {
            logger.debug("detach: caught HibernateException, call to convertHibernateException", ex);
            throw convertHibernateAccessException(ex);
        }
    }

    public void refresh(T entity) {
        if (null == entity) {
            throw new InvalidDataAccessResourceUsageException("entity must not be null");
        }
        try {
            getSession().refresh(entity);
        } catch (HibernateException ex) {
            logger.debug("refresh: caught HibernateException, call to convertHibernateException", ex);
            throw convertHibernateAccessException(ex);
        }
    }

    @SuppressWarnings("unchecked")
    public T merge(T entity) {
        if (null == entity) {
            throw new InvalidDataAccessResourceUsageException("entity must not be null");
        }
        try {
            return (T) getSession().merge(entity);
        } catch (HibernateException ex) {
            logger.debug("merge: caught HibernateException, call to convertHibernateException", ex);
            throw convertHibernateAccessException(ex);
        }
    }
}