Eu estou usando JPA (Hibernate 4.*), JBOSS 7.1, PostgresSQL numa aplicação web “comum” utilizando Injeção de dependência e EntityManager.
porem para sanar o problema do Lazy, optamos por usar OpenSessionInView, porem utilizar o mesmo em filtros gera consultas ao banco de forma desnecessárias (para cada filtro ou ciclo ele acaba buscando no banco novamente, e mesmo que na mesma transação consome muito do nosso banco), a solução foi optar por PhaseListener, esse por sua vez em outra aplicação mais “simples” funcionou porem na nova estrutura da um certo problema:
E isso ocorre em poucas telas do sistema, pelo que me parece acontece um loop no phaseListener entrando duas vezes no ciclo de vida (mandando e recebendo duas vezes).
Houve umas tentativas para corrigir tal problema mas não funcionou, se possível gostaria de uma mãozinha… Segue o codigo do meu listener responsavel pelo ciclo das transações.
[code]package br.salus.util;
import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;
import javax.naming.InitialContext;
import javax.transaction.UserTransaction;
public class TransactionListener implements PhaseListener {
private static final long serialVersionUID = 5110888317326015804L;
private InitialContext ctx = null;
private static final String USER_TRANSACTION_JNDI = "java:comp/UserTransaction";
public TransactionListener() throws Exception {
this.ctx = new InitialContext();
}
public void beforePhase(PhaseEvent phaseEvent) {
PhaseId phaseId = phaseEvent.getPhaseId();
if (phaseId == PhaseId.RESTORE_VIEW) {
// handle transactions in a non-portal environment
try {
UserTransaction tx = (UserTransaction) ctx.lookup(USER_TRANSACTION_JNDI);
tx.begin();
} catch (Exception e) {
e.printStackTrace();
}
}
}
public void afterPhase(PhaseEvent phaseEvent) {
PhaseId phaseId = phaseEvent.getPhaseId();
boolean commitTran = phaseId == PhaseId.RENDER_RESPONSE;
if(commitTran) {
UserTransaction tx = null;
boolean rollback = false;
try {
tx = (UserTransaction) ctx.lookup(USER_TRANSACTION_JNDI);
} catch (Throwable t) {
rollback = true;
throw new RuntimeException(t);
} finally {
if (tx != null) {
try {
if (rollback) {
tx.rollback();
} else {
tx.commit();
}
} catch (Exception e) {
// if exceptions occur with transaction rollback and
// committ...not a whole lot you can do about it
e.printStackTrace();
}
}
}
}
}
@Override
public PhaseId getPhaseId() {
return PhaseId.ANY_PHASE;
}
}
[/code]
Não sei mais onde procurar para sanar esse problema.