HIbernate com JSF

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

olá,

olha eu uso o interceptador…

da uma olhadinha nisso aqui…

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

blz

Vlw por responder, é algo assim q preciso…

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

HIbernateUtil

[code]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;
}[/code]

DaoFactoryImpl:

[code]public class DaoFactoryImpl implements DaoFactory{

private Session session;   

public DaoFactoryImpl() {
    this.session = HibernateUtil.getSessionFactory().getCurrentSession();
}


}[/code]

o filtro:

[code]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() {
}

}[/code]

e no web.xml

[code]
HibernateFilter
br.com.cf.vitrola.servlet.filter.HibernateSessionRequestFilter

<filter-mapping>
    <filter-name>HibernateFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>  [/code]

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

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

[code]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)

[/code]

Alguem ai sabe oq pode estar acontecendo?..
obrigado

[quote=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[/quote]

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.

Coloca isso no seu arquivo de configuracao do hibernate!

thread

:wink:

[quote=rlazoti]Coloca isso no seu arquivo de configuracao do hibernate!

thread

:wink:
[/quote]

rodrigo…vlw cara…era isso msm!!!

[quote=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.[/quote]

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:

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

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

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

}[/code]

Filter

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

}

}[/code]

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