Boa noite pessoal, uma dúvida que sempre tive com relação ao EntityManager foi sobre seu escopo em um ambiente J2EE não gerenciado.
Abrir e fechar a cada transação? Abrir e fechar a cada operação de negócio? Abrir e fechar a cada Requisição HTTP?
Andei lendro sobre isso mas não encontrei uma resposta clara (ou não consegui entender
).
Suponha que tenho uma aplicação com struts 2 e hibernate, e quando vou persistir o objeto X a seguinte sequência de acontende:
action -> bo -> dao
Bem, se eu fechar a cada transação, se o objeto X possuir uma lista LAZY e eu fizer X.getLista() na minha action vou obter um org.hibernate.LazyInitializationException.
Além disso este modo me traria outro problema:
Se uma operação de negócios envolver várias entidades e ocorrer um erro na persistência de alguma, um rollback não teria o resultado esperado, pois o escopo não envonve a operação toda, ele é para cada entidade.
Neste caso uma solução seria criar o entiry manager na camada BO e injetálo no DAO?
Ou ainda utilizar somente um EntityManager para a requisição http?
Atualmente estou abrindo um EntityManager para cada dao mas não estou fechando eles, isso é aceitável?
Agradeço a contribuição.
Abraços