Pessoal…
Fazendo uns testes aqui pude notar o seguinte:
Se uso um EntityManager por servico… tipo
Imaginna o cenário onde preciso usar um serviço de salvar um registro na base de dados, tenho o seguinte escopo
1 - Obtenho um NOVO EntityManager do EntityManagerFactory
2 - inicio a transação
3 - persisto o registro
4 - comito a transação
5 - fecho o EntityManager
Isso funciona perfeitamente, porém o sistema de cache não funciona muito bem, exemplo: Quando tento fazer um merge de um
registro que não existe na base de dados, ao invéz de dar erro de persistencia, ele insere o registro no banco. E tambem, quando
tento inserir um registro com chave primária duplicada, ele só propaga o erro quando eu comito, e não quando eu persisto, a não ser
que eu execute um flush após comitar, porém tenho dúvidas se isso é correto.
Esse tipo de coisa não acontece quando uso apenas um EntityManager para toda a aplicação, tendo o seguinte escopo:
1 - Obtenho um EntityManager do EntityManagerFactory, caso não tenha um inicialmente eu o crio, e depois uso o mesmo para TODOS os outros serviços
2 - inicio a transação
3 - persisto o registro
4 - comito a transação
5 - e NÃO fecho o EntityManager pois será usado para os outros serviços
Nesse tipo escopo, funciona legal, se tento persistir um registro duplicado, no momento do persist ele propaga um erro, ou se tento fazer um merge
de um registro que não existe, tambem propaga o erro. Porém… eu tenho um grande problema, como eu uso um EntityManager para toda aplicação,
se eu tiver serviços paralelos, onde os dois iniciam a transação, vou ter um grande problema.
Depois desses testes, eu fiquei mais na dúvida ainda de como usar o EntityManager para uma aplicação Desktop.
Alguém teria alguma solução?