Olá a todos,
bem estou quebrando a cabeça aqui pra entender o que que acontece na minha aplicação, eu estou usando o PhaseListener para criar e fechar minhas sessões do hibernate abro uma sessão em beforePhase -> RESTORE_VIEW e fecho a sessão em afterPhase ->RENDER_RESPONSE, e podia jurar de pé junto que iria funcionar perfeitamente … porém depois de um certo ponto no projeto apareceu o tal error "javax.faces.el.EvaluationException: org.hibernate.HibernateException: Illegal attempt to associate a collection with two open sessions
" … então fiz o debug da PhaseListener e já no primeiro link que clico em minha página o console me retorna isso:
Antes da Fase RESTORE_VIEW 1
Antes da Fase RESTORE_VIEW 1
Abriu sessao!!!
Depos da Fase RESTORE_VIEW 1
Antes da Fase APPLY_REQUEST_VALUES 2
Depos da Fase APPLY_REQUEST_VALUES 2
Antes da Fase PROCESS_VALIDATIONS 3
Depos da Fase PROCESS_VALIDATIONS 3
Antes da Fase UPDATE_MODEL_VALUES 4
Depos da Fase UPDATE_MODEL_VALUES 4
Antes da Fase INVOKE_APPLICATION 5
Depos da Fase INVOKE_APPLICATION 5
Antes da Fase RESTORE_VIEW 1
Antes da Fase RESTORE_VIEW 1
Abriu sessao!!!
Depos da Fase RESTORE_VIEW 1
Antes da Fase RENDER_RESPONSE 6
Depos da Fase RENDER_RESPONSE 6
fechou sessao!!!
Pra não ficar solto, o código do meu debug é esse:
public class ListenerFasesHandler implements PhaseListener {
public void beforePhase(PhaseEvent fase) {
System.out.println("Antes da Fase " + fase.getPhaseId());
if (fase.getPhaseId().equals(PhaseId.RESTORE_VIEW)) {
System.out.println("Antes da Fase " + fase.getPhaseId());
Session session1 = FacesContextHandler.getRequestSession();
if (session1 == null) {
Session session = HibernateUtil.getSessionFactory().openSession();
System.out.println("Abriu sessao!!!");
session.beginTransaction();
FacesContextHandler.setRequestSession(session);
}
}
}
public void afterPhase(PhaseEvent fase) {
System.out.println("Depos da Fase " + fase.getPhaseId());
if (fase.getPhaseId().equals(PhaseId.RENDER_RESPONSE)) {
Session session = FacesContextHandler.getRequestSession();
if (session != null) {
try {
System.out.println("fechou sessao!!!");
session.getTransaction().commit();
} catch (Exception e) {
if (session.getTransaction().isActive()) {
session.getTransaction().rollback();
}
} finally {
session.close();
}
}
}
}
public PhaseId getPhaseId() {
return PhaseId.ANY_PHASE;
}
}
*esse teste:
if (session1 == null)
eu coloquei depois na esperança de fazer alguma diferença ! ^^ … mas enfim …
Realmente não entendo o que que está acontecendo … o link que eu clico é esse :
<rich:menuItem submitMode="ajax" value="Novo usuario"
action="novoUsuario" >
pra mim um link normal … tirando que esté link está em um template … estou usando facelets, tem alguma coisa a ver?
Bem antes que alguem venha e coloque este link http://balusc.blogspot.com/2006/09/debug-jsf-lifecycle.html pra eu ler … eu já o li várias vezes ! =)
Mas enfim, continuo não entendendo, alguem tem alguma ideia do que que poder ser ?! De alguma maneira pra evitar isso … !? Qualquer dica vale !
Desde já muito obrigado ! !
Walter

