Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Tratamento de LazyInicializationExceptioncom EJB

Olá utilizo EJB com CDI e JSF em uma aplicação.

Tenho tido alguns problemas com LazyInicializationException. O que acontece é que ao inicializar uma pagina JSF, é carregado o Managed Bean da mesma no entanto gerenciado pelo CDI com @Named.

Dentro dessa pagina eu tenho um campo que chama um dialogo com uma tabela com todos os registros cadastrados. Esse dialogo está em um outro managed bean, específico somente para o dialogo, onde o mesmo busca todos os registros. Ao selecionar um registro na tabela do dialogo, o registro é enviado através do evento ajax "dialogReturn" do JSF para o bean da pagina de cadastro.

Percebemos entao que a consulta foi realizada dentro de um Bean diferente do Bean de cadastro.

Ou seja, a transacao que o EJB abriu com o JPA foi no bean de selecao, e quando eu seleciono o registro o mesmo retorna ao bean de cadastro, e o EJB fecha a transacao automaticamente.

Nesse caso se eu precisar buscar algum relacionamento @OneToMany do registro dentro do bean de cadastro, ocorrerá um LazyInicializationException, pois a transacao de busca foi aberta no bean de selecao, e essa transacao jã nao existe mais no bean de cadastro.

Gostaria de saber se é possível a criação de um Filter de EntityManager para que a transação continue online entre os beans.

Ou se tem alguma outra forma de tratar isso.

Alguma ideia?

3 respostas

Boa tarde Rafael, esse problema é bem comum, dá uma olhada no padrão open session in view

Boa tarde Guilherme, já pesquisei em vários fóruns, mas não consegui encontrar o padrão Open Session in View que fucionasse com EJB.

Encontrei com Spring mas não com EJB.

Você sabe de alguma implementação?

solução!

Utilizei a solução de na classe de seleção antes de enviar para a classe de cadastro, fizesse um .size() em todos os gets que retornam uma lista.