Hibernate GenericDAO sem mistério

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:

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();    
		}
	}

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:

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.