UserTransaction PhaseListener ERRO JBAS010152

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.