El idioma habitual que veo para crear el EntityManager es algo como esto:maneras diferentes de conseguir el EntityManager
public class BaseDao {
private static final String PERSISTENCE_UNIT_NAME = "Employee";
EntityManagerFactory factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
public EntityManager getEntityManager() {
return factory.createEntityManager();
}
}
continuación, se utiliza la siguiente manera:
Employee emp = new Employee();
emp.setName("Joe M");
getEntityManager().persist(emp);
La pregunta es ¿por qué no hacerlo de esta manera:
public class BaseDao{
private static final String PERSISTENCE_UNIT_NAME = "Employee";
EntityManagerFactory factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
private EntityManager entityManager = null;
public void setEntityManger() {
EntityManagerFactory factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
this.entityManager = factory.createEntityManager();
}
public EntityManager getEntityManager() {
return this.entityManager;
}
}
En otras palabras, existe la necesidad de obtener siempre el administrador de entidades a través de factory.crea teEntityManager()? o puede crearse como una variable de instancia (o incluso estática) y recuperarse así?
Para aclarar, me refiero a un entorno que no utiliza contenedores EJB o Spring.
Gracias.
gracias - Agregué una nota a mi publicación original aclarando que no estoy en un entorno empresarial, por lo tanto, la inyección de contenedor no está disponible. Sin embargo, sí he notado tu comentario sobre la seguridad de las hebras. – jayjay
RE thread-safety - Supongo que se refiere a mi ejemplo, ya que un EntityManager inyectado y administrado por un contenedor sería seguro para subprocesos. – jayjay
No, no será seguro para subprocesos, pero el contenedor crea uno nuevo cuando sea necesario (podría estar equivocado), por lo que parece que es seguro para subprocesos. Si no está en ningún entorno empresarial, entonces no veo ningún problema en crear una instancia estática de fábrica EntityManagerFactory, y lo llamo para obtener instancias de EntityManager cuando sea necesario. Y no olvide cerrarlos después de cada transacción. Este hilo muestra un código que puede ser útil para usted. http://stackoverflow.com/questions/7329873/how-should-manage-database-transactions-using-entity-manager-in-a-relatively-lar – Mansour