Escopo de um EntityManager para aplicação desktop

Pessoal, tenho uma grande dúvida em relação ao escopo de um EntityManager em uma aplicação desktop.

Sempre trabalhei com aplicações EE, e como o EJB+Servidor controlam as persistencias, acabamos não vendo como é gerenciado a criação de EntityManager.

Porém, agora estou desenvolvendo uma aplicação Desktop, e estou com a seguinte dúvida:

  • Devo criar um EntityManager para cada Entity, para que gerencie toda as interações com o banco de dados para essa única Entity?
  • Ou, para cada transação com o banco de dados, para qualquer Entity, eu posso criar um novo EntityManager?

Não sei se fui bem claro, mais se alguem puder me ajudar em agradeço.

Ou… posso usar somente um EntityManager para todos os meus Entities, durante toda a axecução da aplicação?

Na minha opinião esta seria a melhor alternativa:

Não vejo muito necessário criar vários Entity Managers… Acho mais adequado criar apenas um pelo Entity Manager Factory e definir um ponto global para acessa-lo…

t+

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?