Por que não usar o OpenEntityManagerInViewFilter do Spring

Embora muitas publicações tenham sido escritas sobre o assunto do OpenSession / EntityManagerInViewFilter do Spring, não consegui encontrar nenhuma que mencionasse suas falhas. Pelo que entendi e assumindo uma arquitetura típica de aplicativo da web em camadas usando uma camada de serviço @Transactional, o filtro funciona da seguinte maneira:

O filtro intercepta uma solicitação de servletO filtro abre um EntityManager e o vincula ao thread atualControlador da Web é chamadoServiço de chamadas do controlador da WebO interceptor de transação inicia uma nova transação, recupera o EntityManager ligado ao encadeamento e o liga à transaçãoO serviço é chamado, faz algumas coisas com o EntityManager e retornaO interceptor de transação libera o EntityManager e, em seguida, confirma a transaçãoO controlador da Web prepara a visualização e retornaA vista é construídaFiltro fecha o EntityManager e o desassocia do encadeamento atual

Nos passos 8 e 9, os objetos que foram carregados pelo EntityManager da thread ainda são gerenciados. Conseqüentemente, se as associações preguiçosas forem tocadas nessas etapas, elas serão carregadas do banco de dados usando o EntityManager ainda aberto. Pelo que entendi, cada um desses acessos exigirá que o banco de dados abra uma transação. O gerenciamento de transações da Spring não saberá disso, por isso estou chamando de "transação implícita".

Eu vejo 2 problemas com isso:

Carregar várias associações lazy resultará em várias transações do banco de dados, um possível impacto no desempenhoO objeto raiz e suas associações preguiçosas são carregados em transações de banco de dados diferentes, portanto, os dados podem estar obsoletos (por exemplo, raiz carregada pelo encadeamento 1, associações raiz atualizadas pelo encadeamento 2, associações raiz carregadas pelo encadeamento 1)

Por um lado, esses dois problemas parecem suficientes para rejeitar o uso desse filtro (acerto de desempenho, inconsistência de dados). Por outro lado, esta solução é muito conveniente, evita escrever várias linhas de código, o problema 1 pode não ser tão perceptível e o problema 2 pode ser pura paranóia.

O que você acha?

Obrigado!

questionAnswers(4)

yourAnswerToTheQuestion