Когда следует создавать / открывать экземпляр EntityManagerFactory?

Хорошо, я прочитал кучу статей / примеров, как написать 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 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();
    }

Я убедился, что EntityManager (em) закрыт на уровне метода, как было предложено. Но когда тогда следует закрыть EntityManagerFactory? И почему EMF так плохо должен быть одноэлементным ??? Я читал о проблемах параллелизма, но, поскольку я не опытный программист с несколькими потоками, я не могу понять эту идею.

24
задан masato-san 28 December 2010 в 06:37
поделиться