He creado algunas cosas de JPA en el pasado que usaban una instancia de javax.persistence.EntityManager
por instancia de DAO; esta es la forma en que se configuran la mayoría de los ejemplos.JPA EntityManager ¿Estático o Instancia?
public class BaseDaoThatEveryDaoExtends {
@PersistenceContext
private EntityManager entityManager;
}
he tropecé con el código que utiliza un estáticajavax.peristence.EntityManger
inyectado por una anotación de PersistenceContext
, el arquitecto me dice que esto no causa ningún problema y nunca tuvo ningún problema incluso en una aplicación en clúster con JTA y un XA fuente de datos:
public class BaseDaoThatEveryDaoExtends {
@PersistenceContext
private static EntityManager entityManager;
}
Por lo que yo puedo decir que esto es un anti-patrón que el EntityManager
mantiene cierta información de estado y lo que es estática hace que la aplicación del estado entero de ancho. Además, esto hace que las clases sean muy difíciles de probar.
¿Hay otros inconvenientes para hacer esto o es esta una forma estándar de usar un EntityManager
?
Una NPE también es posible cuando se construye manualmente una instancia de DAO en lugar de inyectarla e invoca los métodos de instancia en ella. Para que no sea realmente un argumento. – BalusC
Excepto que no tiene que construir el BaseDaoThatEveryDaoExtenses, simplemente llame a BaseDaoThatEveryDaoExtends.doSomeStaticwork() que puede dar como resultado un NPE. –