Olá,
Em todo exemplo que eu vejo de JPA, o EntityManagerFactory é um singleton (ou injetado), enquanto que o EntityManager é sempre instanciado um novo a cada chamada de método service.
Por que o EntityManager não pode também ser um Singleton (ou injetado) ??
Exemplo:
//imports
public class BasicService {
protected static EntityManagerFactory entityManagerFactory;
protected static EntityManager entityManager;
protected static EntityTransaction transaction;
static {
entityManagerFactory = Persistence.createEntityManagerFactory("persistenceUnit");
entityManager = entityManagerFactory.createEntityManager();
transaction = entityManager.getTransaction();
}
}
//imports
public class UsuarioService extends BasicService {
public void add(Usuario usuario) throws Exception {
try {
transaction.begin();
entityManager.persist(usuario);
transaction.commit();
} catch (Exception e) {
transaction.rollback();
throw e;
}
}
public void update(Usuario usuario) throws Exception {
try {
transaction.begin();
entityManager.merge(usuario);
transaction.commit();
} catch (Exception e) {
transaction.rollback();
throw e;
}
}
}
Eu coloquei desta forma, e está funcionando, além de estar mais rápido do que quando eu instancio o EntityManager a cada chamada dos métodos.