Ok, he leído un montón de artículos/ejemplos sobre cómo escribir Entity Manager Factory en singleton.¿Cuándo se debe crear/abrir la instancia de EntityManagerFactory?
Uno de ellos más fácil de entender para mí un poco:
http://javanotepad.blogspot.com/2007/05/jpa-entitymanagerfactory-in-web.html
supe que EntityManagerFactory (EMF) sólo se creará una vez preferentemente en el alcance de la aplicación. (?)
Y también asegúrese de cerrar la FEM una vez que se utiliza
así que escribí clase de ayuda EMF para los métodos de negocio a utilizar:
public class EmProvider {
private static final String DB_PU = "KogaAlphaPU";
public static final boolean DEBUG = true;
private static final EmProvider singleton = new EmProvider();
private EntityManagerFactory emf;
private EmProvider() {}
public static EmProvider getInstance() {
return singleton;
}
public EntityManagerFactory getEntityManagerFactory() {
if(emf == null) {
emf = Persistence.createEntityManagerFactory(DB_PU);
}
if(DEBUG) {
System.out.println("factory created on: " + new Date());
}
return emf;
}
public void closeEmf() {
if(emf.isOpen() || emf != null) {
emf.close();
}
emf = null;
if(DEBUG) {
System.out.println("EMF closed at: " + new Date());
}
}
}//end class
Y mi método usando EmProvider:
public String foo() {
EntityManager em = null;
List<Object[]> out = null;
try {
em = EmProvider.getInstance().getEntityManagerFactory().createEntityManager();
Query query = em.createNativeQuery(JPQL_JOIN); //just some random query
out = query.getResultList();
}
catch(Exception e) {
//handle error....
}
finally {
if(em != null) {
em.close(); //make sure to close EntityManager
}
//should I not close the EMF itself here?????
EmProvider.getInstance().closeEmf();
}
Me aseguré de cerrar EntityManager (em) dentro del nivel de método como se sugiere. Pero ¿cuándo se debe cerrar EntityManagerFactory? ¿Y por qué EMF tiene que ser singleton tan malo? Leí sobre problemas de simultaneidad, pero como no tengo experiencia en la gramática de múltiples hilos, no puedo ser claro sobre esta idea.
"¿Y por qué EMF tiene que ser singleton tan malo ???" esta afirmación probablemente debería abrir otra pregunta ... –