Hibernate GenericDAO sem mistério

3 respostas
G111

Oi ! :smiley:

Estou estudando o hibernate, mas estou vendo muitas formas de implementar buscas, saves, delete e etc.
Vi alguns exemplos de genericDao e cada um tinha uma coisa diferente.
Poderiam me sugerir uma melhor forma pra fazer meus metodos de acesso a banco ?
Gostaria que fosse utilizando apenas o hibernate com Session e não JPA, pq com esse eu já vi um exemplo bom.
Se possível com controle de transação na mão para entender melhor.
Tem exemplos que vi q usam metodos que abrem e fecham transação até em buscas. Precisa disso ?
Tem alguns q utilizam flush() e outros não. To estudando, mas se puderem me adiantar esses detalhes !!

Obrigada !!
:stuck_out_tongue:

3 Respostas

diogoprosoft

Então você pode criar diversas maneiras de fazer um DAO genérico para implementar o seu hibernate, eu tenho uma classe só com métodos genéricos que criei, vou postar um exemplo comum para ver se é o que vc precisa

/**
	 * Método criado para salvar se o registro não existir no banco ou alterar se a primary key for identificada e já existir
	 * @param object - Objeto populado com os registros.
	 * @throws Exception
	 */
	public void saveOrUpdate(Object object) throws Exception{
		try{        
			session.saveOrUpdate(object);
			session.flush();
			transaction.commit();
		}catch(Exception e){
			transaction.rollback();    	
			throw new Exception(e.getMessage());    	
		}finally{
			session.close();    
		}
	}
G111

Eu queria compartilhar oq tenho hoje e gostaria da opinião de vcs !

abstract class GenericDAO<T> implements Serializable {

	private static final long serialVersionUID = -4267978367898190996L;

	private static SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();

	private static ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();
	
	private Class<T> entityClass; 
	
	public GenericDAO(Class<T> entityClass) { 
        this.entityClass = entityClass; 
    }

	public Session getSession() {
		Session session = threadLocal.get();
		if (session == null) {
			session = sessionFactory.openSession();
			threadLocal.set(session);
		}
		return session;
	}

	public void beginTransaction() {
		getSession().beginTransaction();
	}

	public void commit() {
		getSession().getTransaction().commit();
	}

	public void rollBack() {
		getSession().getTransaction().rollback();
	}

	public void closeSession() {
		getSession().close();
	}
	
	
	public void save(T entity) {
		getSession().saveOrUpdate(entity);
	}
	
	public void delete(T entity) {
		getSession().delete(entity);
	}
	
	@SuppressWarnings("unchecked")
	public List<T> findAll() { 
		Criteria criteria = getSession().createCriteria(entityClass);
		criteria.setMaxResults(500);

		return criteria.list();
    } 
	
	@SuppressWarnings("unchecked")
	public T findById(int entityID) { 
        return (T) getSession().get(entityClass, entityID); 
    } 
	
	@SuppressWarnings("unchecked")
	public List<T> findByExample(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(entityClass).add(example).list();  
    }  

}

Dessa forma eu preciso fazer chamadas como essa né ?

beginTransaction();
save(pessoa);
commit();

O commit() já fecha a transação ?
Preciso fechar a Session ?
Vi exemplos em jpa q tem q fechar diretamente por uma chamada a um metodo.
Alguns exemplos usam load() no findById();
Poderiam dizer a melhor forma de implementar esses métodos acima ?
Se quiserem compartilhar seus DAO´s agradeço imensamente :wink:

diogoprosoft

O commit fecha a transação, pois a transaction é gerenciada pela session então nesse caso vc deve fechar sua sessão

Transaction transaction = session.beginTransaction();

Quanto a colocar o begin no seu código e chamar o save e depois dar commit eu não aconselho pois vc deve deixar sua regra de negócio na Implementação, então crie um DAO genérico e faça sua regra na Implementação e só use na sua classe controller, essa é a minha dica, pode haver uma galera ai que faça diferente mais esse seria meu ponto de vista.

Criado 25 de março de 2013
Ultima resposta 25 de mar. de 2013
Respostas 3
Participantes 2