Pessoal bom dia!
Estou começando a aprender sobre programação web e estou com um problema com abertura de session utilizando EntityManager, é o seguinte:
quando rodo a aplicação, o selectItens aparece normalmente com os itens recuperados do banco, mas quando dou um submit, aparece a seguinte mensagem:
exception
javax.servlet.ServletException: Session is closed!
root cause
org.hibernate.SessionException: Session is closed!
segue as classes:
ListenerFasesJSF
public class ListenerFasesJSF extends Aux implements PhaseListener {
@Override
public void beforePhase(PhaseEvent fase) {
if (fase.getPhaseId().equals(PhaseId.RESTORE_VIEW)) {
session.beginTransaction();
FacesContextUtil.setRequestSession(session);
}
}
@Override
public void afterPhase(PhaseEvent fase) {
if (fase.getPhaseId().equals(PhaseId.RENDER_RESPONSE)) {
session = FacesContextUtil.getRequestSession();
try {
session.getTransaction().commit();
} catch (Exception e) {
System.out.println("Erro no commit da transação");
System.out.println(e.getMessage());
e.printStackTrace();
if (session.getTransaction().isActive()) {
session.getTransaction().rollback();
}
} finally {
session.close();
}
}
}
@Override
public PhaseId getPhaseId() {
return PhaseId.ANY_PHASE;
}
}
Auxiliar
public class Aux {
public EntityManagerFactory emf;
public EntityManager em ;
public Session session;
public Aux() {
emf = Persistence.createEntityManagerFactory("rcrwebPU");
em = emf.createEntityManager();
if (em.getDelegate() instanceof EntityManagerImpl) {
EntityManagerImpl entityManagerImpl = (EntityManagerImpl) em.getDelegate();
session = entityManagerImpl.getSession();
} else {
session = (Session) em.getDelegate();
}
}
}
FacesContextUtil
public class FacesContextUtil {
private static final String HIBERNATE_SESSION = "hibernate_session";
public static void setRequestSession(Session session) {
FacesContext.getCurrentInstance().getExternalContext().getRequestMap().put(HIBERNATE_SESSION, session);
}
public static Session getRequestSession() {
return (Session) FacesContext.getCurrentInstance().getExternalContext().getRequestMap().get(HIBERNATE_SESSION);
}
}
Já pesquisei pela WEB e não encontrei resposta de como abrir sessão utilizando EntityManager,
desde já agradeço a ajuda!!