Хорошо, я прочитал кучу статей / примеров, как написать Entity Manager Factory в синглтоне .
Один из них, который мне легче всего понять:
http://javanotepad.blogspot.com/2007/05/jpa-entitymanagerfactory-in-web.html
Я узнал, что EntityManagerFactory (EMF) должен быть создан только один раз, желательно в области приложения.
А также не забудьте закрыть EMF после его использования (?)
Поэтому я написал вспомогательный класс EMF для использования бизнес-методов:
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
И мои метод с использованием EmProvider:
public String foo() {
EntityManager em = null;
List
Я убедился, что EntityManager (em) закрыт на уровне метода, как было предложено. Но когда тогда следует закрыть EntityManagerFactory? И почему EMF так плохо должен быть одноэлементным ??? Я читал о проблемах параллелизма, но, поскольку я не опытный программист с несколькими потоками, я не могу понять эту идею.