Vanja, ako koristiš neki EE server (Glassfish, SJSAS..), stvar se svodi na ubrizgavanje EntityManagerFactory i EntityManager-a (Googlaj za "JPA injection") koristeći "Annotations" - praktično 2-3 linije koda, gde treba. Nema potrebe za singetonom i ostalim, koliko je meni poznato.
Singleton pattern za EntityManagerFactory.. je potreban u slučaju da JPA (Java Persistence API, dakle npr. TopLink Essentials) koristiš iz Java SE okruženja (npr. TomCat). U tom slučaju, mislim da je najbolje implementirati ServletContextListener listener: jedan metod se izvršava samo jednom - kada se web aplikacija stavlja u pogon na serveru (npr. TomCat) i drugi, kada se aplikacija "gasi". U prvom slučaju se kreira referenca do EntityManagerFactory-ja, a u drugom se Factory zatvori.
Otprilike..(mada, može i značajno kraće! Ovako je da se ljudi upoznaju i sa metodama u listeneru):
Code:
public class ApplicationListener implements ServletContextListener
{
private EntityManagerFactory emf = null;
public void contextInitialized(ServletContextEvent sce)
{
System.out.println( "Application initialization..." );
if ( emf == null )
{
emf = javax.persistence.Persistence.createEntityManagerFactory( "proba1PU" );
// .... dalje radi šta ti je volja sa referencom na Ent. Man. Fac. / izloži je da bude dostupna ostalim komponentama..
}
}
public void contextDestroyed(ServletContextEvent sce)
{
System.out.println( "Application shutdown..." );
if ( emf.isOpen() )
emf.close();
}
Što naravno, povlači da samo još TomCatu trebaš reći, u web.xml, o ovom listeneru, kako bi pozvao ove dve metode pri startu/gašenju.
A to onda omogućuje da tu referencu (emf) proslediš gde i kada treba, tako da u nekom JSP-u ili servletu jednostavno imaš:
Code:
EntityManager em = xxxx.getEMF().createEntityManager();
...
...
finally {
em.close();
}
Sve u svemu, uskoro, verovatno seledeće nedelje ću da objavim jedan (kasnije valjda još neki) tekst na NoveTehnologije.com baš na temu korišćenja baš JPA (sa osvrtom na ORM) Trebalo bi da bude interesantno :)