HibernateFilter em app JSF

5 respostas
cs.santos0

Iai

abri uma thread anteriormente sobre um problema com conexão com hibernte usando numa app JSF…ai comecei a pesquisar sobre e resolvi abrir um novo post…

oq eu preciso para construir uma conexão boa com hibernate?..eu fiz algumas configurações, mas acho q esta faltando algo…eu preciso usar algo como um Filter para abrir alguma conexão?..eu vi q esse HibernateFilter existe, mas não entendi para q ele serve…alguem poderia me ajudar?..eu apenas criei meu DaoFactory, funciona, mas ainda tem algum ponto falho…ai gostaria de aprender melhor a construi-lo…

Se alguem puder me dar uma força, eu agradeço
vlw

5 Respostas

maurenginaldo

Como assim um Filter para abrir conexão. Explica melhor o seu cenário para podermos ajudá-lo.

cs.santos0

ok....

Primeiro criei uma class Dao:

package br.com.cienci.nfe.dao;

import java.util.List;
import org.hibernate.Session;

public class Dao<T> {

	private Session session;
	private final Class classe;
	
	public Dao(Session session, Class classe){
		this.session = session;
		this.classe = classe;
	}
	
	public void adiciona(T u){
		this.session.save(u);
	}

	public void remove(T u){
		this.session.delete(u);
	}
	
	public void atualiza(T u){
		this.session.merge(u);
	}
	
	public List<T> listaTudo(){
		return this.session.createCriteria(this.classe).list();
	}

	public T procura(Long id){
		return (T) session.load(this.classe, id);
	}
	
	protected Session getSession(){
		return session;
	}
}

Depois uma HibernateUtil:

package br.com.cienci.nfe.dao;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.cfg.Configuration;

public class HibernateUtil {

    private static SessionFactory factory;
   
    static {
        Configuration conf = new AnnotationConfiguration();
        conf.configure();
        factory = conf.buildSessionFactory();
    }
 
    public static Session getSession() {
        return factory.openSession();
    }
}

Depois uma DaoFactory:

package br.com.cienci.nfe.dao;

import br.com.cienci.nfe.modelo.Login;
import br.com.cienci.nfe.modelo.Role;
import org.hibernate.Session;
import org.hibernate.Transaction;

public class DaoFactory {

    private Session session;
    private Transaction transaction;
    
    public DaoFactory() {
        this.session = HibernateUtil.getSession();
    }
  
    public void beginTransaction() {
        this.transaction = this.session.beginTransaction();
    }
   
    public void commit() {
        this.transaction.commit();
        this.transaction = null;
    }
   
    public boolean hasTransaction() {
        return this.transaction != null;
    }
   
    public void rollback() {
        this.transaction.rollback();
        this.transaction = null;
    }

    public void close() {
        this.session.close();
    }    
    
    public Dao<Login> getLoginDao(){
        return new Dao<Login>(this.session, Login.class);
    }
    
    public Dao<Role> getRoleDao(){
        return new Dao<Role>(this.session, Role.class);
    }    
    
    protected Session getSession() {
        return session;
    }
}

Depois no meu backing bean utilizo eles assim:

public class UsuarioBean {

    private DaoFactory daoFactory;

    public UsuarioBean() {
        this.daoFactory = new DaoFactory();        
    }

    public String removerUsuario() {

        try {
            this.daoFactory.beginTransaction();
            this.daoFactory.getLoginDao().remove(this.getLoginFromList());
            this.daoFactory.commit();
        } catch (HibernateException ex) {
            this.daoFactory.rollback();
            System.err.println(ex.getMessage());
      }
       return "sucesso";
    }
       
}

Gostaria de saber se esta faltando alguma coisa, para ficar um modelo legal...se eu preciso de algo para deixar uma transação aberta..se falta alguma interface.....

pq eu vim do VRaptor com framework, e nele eu usava uma DaoInterceptor para iniciar e finalizar as transações...mas usando JSF eu não uso nda do tipo...

Será q alguem pode me dar uma força...
vlw

maurenginaldo

Não acho legal fazer transações no seu modelo de dados no managed bean, não fica bem separado as suas camadas.
Mude o código do seu removerUsuario() para um DAO onde seu MB apenas encaminha esse pedido para ele.

cs.santos0

vc poderia me dar um exemplo?

maurenginaldo

Cria um DAO e trabalha dentro dele com o método removeUsuario.
Aí do MB vc chama usuarioDao.remove(usuario).

Criado 25 de setembro de 2008
Ultima resposta 26 de set. de 2008
Respostas 5
Participantes 2