HIbernate com JSF

8 respostas
cs.santos0

Iai pessual, blz?

entao, tenho usado hibernate com jsf nas minhas aplicações, mas não sei se estou usando da melhor maneira…

gostaria de saber qual a melhor forma de controlar as transações do hibernate usando JSF?..

tipo, vcs abrem e fecham as sessões nos metodos do managed bean, ou criam algum interceptador para controlar…enfim, oq consideram a melhor forma de usar?

abraços

8 Respostas

Jeferson_Manetti

olá,

olha eu uso o interceptador…

da uma olhadinha nisso aqui…

https://www.hibernate.org/43.html

blz

cs.santos0

Vlw por responder, é algo assim q preciso....

acompanhei as instruções nesse artigo e cheguei no seguinte resultado:

HIbernateUtil

public class HibernateUtil {

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

    public static SessionFactory getSessionFactory() {
        return factory;
    }

DaoFactoryImpl:

public class DaoFactoryImpl implements DaoFactory{

    private Session session;   
    
    public DaoFactoryImpl() {
        this.session = HibernateUtil.getSessionFactory().getCurrentSession();
    }
...
}
o filtro:
public class HibernateSessionRequestFilter implements Filter {

    private SessionFactory sf;    

    public void init(FilterConfig filterConfig) throws ServletException {
        sf = HibernateUtil.getSessionFactory();
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {

        try {
            sf.getCurrentSession().beginTransaction();
            System.out.println("Transaction Started");
            // Call the next filter (continue request processing)
            chain.doFilter(request, response);

            // Commit and cleanup
            sf.getCurrentSession().getTransaction().commit();
            System.out.println("Transaction Commited");

        } catch (StaleObjectStateException staleEx) {
            throw staleEx;
        } catch (Throwable ex) {
            // Rollback only
            ex.printStackTrace();

            try {
                if (sf.getCurrentSession().getTransaction().isActive()) {
                    sf.getCurrentSession().getTransaction().rollback();
                }
            } catch (Throwable rbEx) {
                rbEx.printStackTrace();
            }
            // Let others handle it... maybe another interceptor for exceptions?
            throw new ServletException(ex);
        }
    }

    public void destroy() {
    }
}

e no web.xml

<filter>
        <filter-name>HibernateFilter</filter-name>
        <filter-class>br.com.cf.vitrola.servlet.filter.HibernateSessionRequestFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>HibernateFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

essa é minha configuração, é isso msm ou esta faltando algo?

porem quando eu inicio a aplicação de cara ja recebo o erro:

javax.servlet.ServletException: org.hibernate.HibernateException: No CurrentSessionContext configured!
	br.com.cf.vitrola.servlet.filter.HibernateSessionRequestFilter.doFilter(HibernateSessionRequestFilter.java:57)
	org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)


root cause 

org.hibernate.HibernateException: No CurrentSessionContext configured!
	org.hibernate.impl.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:540)
	br.com.cf.vitrola.servlet.filter.HibernateSessionRequestFilter.doFilter(HibernateSessionRequestFilter.java:34)
	org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)

Alguem ai sabe oq pode estar acontecendo?....
obrigado

rponte

cs.santos0:
Iai pessual, blz?

entao, tenho usado hibernate com jsf nas minhas aplicações, mas não sei se estou usando da melhor maneira…

gostaria de saber qual a melhor forma de controlar as transações do hibernate usando JSF?..

tipo, vcs abrem e fecham as sessões nos metodos do managed bean, ou criam algum interceptador para controlar…enfim, oq consideram a melhor forma de usar?

abraços

Uma maneira interessante de se trabalhar com JSF e Hibernate seria tendo algum IoC Container (como Spring ou Seam) para gerenciar os managed beans e componentes da aplicação. Algo semelhante ao deste ótimo artigo, http://cagataycivici.wordpress.com/2008/03/04/annotation-driven-jsf-spring-jpa/

Abraços e boa sorte.

rod

Coloca isso no seu arquivo de configuracao do hibernate!

thread

:wink:

cs.santos0

rlazoti:
Coloca isso no seu arquivo de configuracao do hibernate!

thread

:wink:

rodrigo…vlw cara…era isso msm!!!

rponte:
Uma maneira interessante de se trabalhar com JSF e Hibernate seria tendo algum IoC Container (como Spring ou Seam) para gerenciar os managed beans e componentes da aplicação. Algo semelhante ao deste ótimo artigo, http://cagataycivici.wordpress.com/2008/03/04/annotation-driven-jsf-spring-jpa/

Abraços e boa sorte.

cara, eu tava procurando um tutorial assim a mto tempo…realmente a ideia era usar spring…vou ver se sobra um tempinho pra estudar e adicionar na minha app…vlw a dica ai… :wink:

cs.santos0

Só para confirmar…

um bom metodo no meu Managed Bean do JSF seria igual o descrito abaixo??

public String adicionarCertificadoDigital() { try { this.daoFactory.beginTransaction(); this.daoFactory.getCertificadoDigitalDao().atualiza(this.getCertificadoDigital()); this.daoFactory.commit(); this.certificadoDigital = new CertificadoDigital(); } catch (Exception ex) { this.daoFactory.rollback(); ex.printStackTrace(); }finally{ this.daoFactory.close(); } return "sucesso"; }

isso seria um metodo ideal para esse modelo de Session Factory?
abraços

Jeferson_Manetti
Uma maneira interessante de se trabalhar com JSF e Hibernate seria tendo algum IoC Container (como Spring ou Seam) para gerenciar os managed beans e componentes da aplicação

como o amigo disse essa e uma excelente maneira de se trabalhar... agora se vc não for usar um IoC

vc pode fazer dessa forma:

HibernateUtil
public class HibernateUtil {

	private static Logger logger;
    static{logger = Logger.getLogger("br.com.corpus.appLogger");}
	
	private static ThreadLocal<Session> sessions;
	static{sessions = new ThreadLocal<Session>();}
	
	private static SessionFactory sessionFactory;
	static{
		Configuration config = new AnnotationConfiguration();
		config.configure("hibernate.cfg.xml");
		sessionFactory = config.buildSessionFactory();
	}
		
	public static Session openSession(){
		logger.info("opening new Session");
		if(null != sessions.get()){
			logger.error("Já existe uma Session para esta Thread! =(");
		}
		sessions.set(sessionFactory.openSession());
		return sessions.get();
	}
	
	
	public static void closeCurrentSession(){
		logger.info("close Current Session");
		sessions.get().close();
		sessions.set(null);
	}
	
	public static Session getCurrentSession(){
		logger.info("Getting Current Session");
		return sessions.get();
	}
}
Filter
public class HibernateSessionFilter implements Filter {

	private static Logger logger;
    static{logger = Logger.getLogger("br.com.corpus.appLogger");}
    
    @Override
	public void init(FilterConfig arg0) throws ServletException {

	}
    
	@Override
	public void destroy() {

	}

	@Override
	public void doFilter(ServletRequest req, ServletResponse res,
			FilterChain fc) throws IOException, ServletException {
		
		logger.info("Filtering...");
		HibernateUtil.openSession();
		
		try{
			logger.info("Getting Transaction.");
			HibernateUtil.getCurrentSession().beginTransaction();
			
			fc.doFilter(req, res);
			
			logger.info("Commit Transaction.");
			HibernateUtil.getCurrentSession().getTransaction().commit();
			
		
		}catch (Exception e) {
			logger.error("Erro...",e);
			if(HibernateUtil.getCurrentSession().getTransaction().isActive()){
			      logger.info("RollBack Transaction.");
			      HibernateUtil.getCurrentSession().getTransaction().rollback();
		        }
			
			
			throw new ServletException(e);
			
		}finally{
			HibernateUtil.closeCurrentSession();
		}
		

	}

	}
F

Obrigado Jefferson, não sei o que seria do mundo sem caras como você. Obrigado!

Criado 14 de julho de 2009
Ultima resposta 26 de dez. de 2010
Respostas 8
Participantes 5