br.com.reindex.suri.framework.dao.DaoSupport.java Source code

Java tutorial

Introduction

Here is the source code for br.com.reindex.suri.framework.dao.DaoSupport.java

Source

/*
 * SURICATTUS
 * Copyright 2011, SURICATTUS CONSULTORIA LTDA, 
 * and individual contributors as indicated by the @authors tag
 *
 * This 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 software 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 software; if not, write to the Free
 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
 */
package br.com.reindex.suri.framework.dao;

import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.Collection;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Example;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.springframework.transaction.annotation.Transactional;

import br.com.reindex.suri.framework.util.SearchSort;

/**
 * Classe suporte aos DAOs do projeto.
 * 
 * @author Lucas Lins
 * 
 * @param <T>
 * @param <PK>
 */
@SuppressWarnings("unchecked")
public abstract class DaoSupport<T, PK extends Serializable> {

    // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    // ATTRIBUTES
    // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    protected Class<T> tipo;

    @PersistenceContext
    private EntityManager entityManager;

    // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    // CONSTRUCTORS
    // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    /**
     * Construtor que ja obtem de forma automatica o tipo do DAO.
     */
    public DaoSupport() {
        Type superclass = getClass().getGenericSuperclass();
        if (superclass instanceof ParameterizedType) {
            ParameterizedType parameterizedType = (ParameterizedType) superclass;
            if (parameterizedType.getActualTypeArguments().length > 0) {
                tipo = (Class<T>) parameterizedType.getActualTypeArguments()[0];
            }
        }
    }

    // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    // PROTECTED METHODS
    // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    /**
     * Hibernate session
     * 
     * @return hibernate session
     */
    protected Session getSession() {
        return (Session) entityManager.getDelegate();
    }

    // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    // PUBLIC METHODS
    // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    /**
     * Metodo Responsavel por salvar um novo objeto na base de dados 
     * 
     * @param obj objeto a ser persistido
     */
    @Transactional
    public PK save(T novoObj) {
        return (PK) getSession().save(novoObj);
    }

    /**
     * Metodo Responsavel por salvar [ou alterar] um objeto na base de dados, a escolha a
     * feita com base na verificacao se o objeto ja corresponde a um objeto persistente. 
     * 
     * @param obj objeto a ser persistido
     */
    public void saveOrUpdate(T... objs) {
        for (T t : objs) {
            getSession().saveOrUpdate(t);
        }
    }

    /**
     * Metodo Responsavel por salvar [ou alterar] um objeto na base de dados, a escolha e
     * feita com base na verificacao se o objeto corresponde a um objeto persistente. 
     * 
     * @param obj objeto a ser persistido
     */
    public void saveOrUpdate(Collection<T> objs) {
        for (T t : objs) {
            getSession().saveOrUpdate(t);
        }
    }

    /**
     * Metodo responsavel por excluir uma lista de entidades da base de dados
     * 
     * @param ids Identificadores das entidades a serem removidas da base de dados
     */
    public void delete(PK... ids) {
        if (ids != null && ids.length > 0) {
            for (PK id : ids) {
                if (id != null) {
                    T obj = retrieve(id);
                    if (obj != null) {
                        Object objMerged = getSession().merge(obj);
                        getSession().delete(objMerged);
                    }
                }
            }
        }
    }

    /**
     * Metodo Responsavel por excluir um conjunto de entidades persistentes da base de dados
     * 
     * @param objs Objetos a serem removidos da base de dados
     */
    public void delete(T... objs) {
        for (T t : objs) {
            Object objMerged = getSession().merge(t);
            getSession().delete(objMerged);
        }
    }

    /**
     * Metodo Responsavel por excluir um conjunto de entidades persistentes da base de dados
     * 
     * @param objs Objetos a serem removidos da base de dados
     */
    public void delete(Collection<T> objs) {
        for (T t : objs) {
            Object objMerged = getSession().merge(t);
            getSession().delete(objMerged);
        }
    }

    /**
     * Metodo responsavel por alterar os dados de um objeto ja persistido no banco de dados
     * 
     * @param obj Objeto a ser alterado na base de dados
     */
    @Transactional
    public void update(T... objs) {
        saveOrUpdate(objs);
    }

    /**
     * Metodo responsavel por recuperar um objeto da base de dados
     * 
     * @param id Identificador do objeto a ser recuperado
     * @return Objeto referente ao identificador informado
     */
    @Transactional
    public T retrieve(PK id) {
        return (T) getSession().get(tipo, id);
    }

    /**
     * Metodo responsavel por recuperar todos os objeto de uma tabela da base de dados
     * 
     * @return todos os objetos da classe
     */
    @Transactional
    public List<T> retrieveAll() {
        return getSession().createCriteria(tipo).setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY).list();
    }

    /**
     * Metodo Responsavel por recuperar todos os objeto de uma tabela da base de dados de forma ordenada
     * 
     * @param sort asc - ascending or desc - descending
     * @param propertyName property to be ordered
     * @return todos os objetos da classe
     */
    public List<T> retrieveAll(SearchSort sort, String... propertiesName) {
        Criteria criteria = getSession().createCriteria(tipo);
        if (SearchSort.ASCENDING.equals(sort)) {
            for (String property : propertiesName) {
                criteria.addOrder(Order.asc(property));
            }
        } else if (SearchSort.DESCENDING.equals(sort)) {
            for (String property : propertiesName) {
                criteria.addOrder(Order.desc(property));
            }
        }
        return criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY).list();
    }

    /**
     * Metodo responsavel por recuperar todos os objeto de uma tabela da base de dados
     * 
     * @param nome da propriedade, valor da propriedade(filtro), tipo de busca (comeca ou contem)
     * @return todos os objetos da classe que se adequam aos filtros
     */
    public List<T> retrieveByProperty(String propertyName, Object value) {
        return getSession().createCriteria(tipo).add(Restrictions.eq(propertyName, value)).list();
    }

    /**
     * Metodo responsavel por recuperar todos os objeto de uma tabela da base de dados
     * 
     * @param nome da propriedade, valor da propriedade(filtro), tipo de busca (comeca ou contem)
     * @return todos os objetos da classe que se adequam aos filtros
     */
    public List<T> retrieveByProperty(String propertyName, String value) {
        return retrieveByProperty(propertyName, value, null);
    }

    /**
     * Metodo responsavel por recuperar todos os objeto de uma tabela da base de dados
     * 
     * @param nome da propriedade, valor da propriedade(filtro), tipo de busca (comeca ou contem)
     * @return todos os objetos da classe que se adequam aos filtros
     */
    public List<T> retrieveByProperty(String propertyName, String value, MatchMode matchMode) {
        if (matchMode != null) {
            return getSession().createCriteria(tipo).add(Restrictions.ilike(propertyName, value, matchMode)).list();
        } else {
            return getSession().createCriteria(tipo).add(Restrictions.ilike(propertyName, value, MatchMode.EXACT))
                    .list();
        }
    }

    /**
     * Metodo responsavel por recuperar todos os objetos de uma tabela da base de dados de acordo
     * com o exemplo passado. 
     * 
     * @param filtro
     * @return lista
     */
    public List<T> retrieveByExample(T filtro) {
        return retrieveByExample(filtro, null, false);
    }

    /**
     * Metodo responsavel por recuperar todos os objetos de uma tabela da base de dados de acordo
     * com o exemplo passado. 
     * 
     * @param filtro
     * @param matchMode
     * @param ignoreCase
     * @return lista
     */
    public List<T> retrieveByExample(T filtro, MatchMode matchMode, boolean ignoreCase) {
        Example example = Example.create(filtro);

        if (matchMode != null) {
            example = example.enableLike(matchMode);
        }

        if (ignoreCase) {
            example = example.ignoreCase();
        }

        return getSession().createCriteria(tipo).add(example).list();
    }

    /**
     * Metodo Responsavel por fazer o merge com um objeto na base de dados, a escolha 
     * 
     * @param obj objeto a ser sincronizado
     * @return objeto sincronizado com a base
     */
    public T merge(T novoObj) {
        T objMerged = (T) getSession().merge(novoObj);
        return objMerged;
    }

    /**
     * Metodo responsavel por sincronizar um objeto da sessao com o atual no banco.
     * 
     * @param obj objeto para refresh
     */
    public void refresh(T obj) {
        getSession().refresh(obj);
    }

    /**
     * Metodo responsavel por remover um objeto da sessao.
     * 
     * @param obj objeto para remocao
     */
    public void evict(T obj) {
        getSession().evict(obj);
    }

}