Vraag Beste praktijk om EntityManagerFactory te krijgen


Wat is de beste manier om EntityManagerFactory in web-app (jsp / servlets) te krijgen? Is dit een goede manier Wanneer moet het EntityManagerFactory-exemplaar worden gemaakt / geopend?, of is het beter om het van JNDI te krijgen, of iets anders?


19
2017-10-22 21:23


oorsprong


antwoorden:


Ze zijn zwaargewicht en ze horen in de toepassingsomvang te zitten. Dus u moet ze openen bij het opstarten van het programma en ze afsluiten bij het afsluiten van de toepassing.

Hoe dat te doen hangt af van uw doelcontainer. Ondersteunt het EJB 3.x (Glassfish, JBoss AS, enz.)? Als dat zo is, dan hoeft u zich geen zorgen te maken over het openen / sluiten (of over transacties) als u gewoon de PPV-taak in EJB's doet met @PersistenceContext de gebruikelijke manier:

@Stateless
public class FooService {

    @PersistenceContext
    private EntityManager em;

    public Foo find(Long id) {
        return em.find(Foo.class, id);
    }

    // ...
}

Als uw doelcontainer geen EJB's ondersteunt (bijv. Tomcat, Jetty, enz.) En een EJB-add-on zoals OpenEJB is om de een of andere reden ook geen optie, en je bent dus handmatig aan het spelen met het creëren EntityManagers (en transacties) zelf, dan is uw beste gok een ServletContextListener. Hier is een basis- aftrapvoorbeeld:

@WebListener
public class EMF implements ServletContextListener {

    private static EntityManagerFactory emf;

    @Override
    public void contextInitialized(ServletContextEvent event) {
        emf = Persistence.createEntityManagerFactory("unitname");
    }

    @Override
    public void contextDestroyed(ServletContextEvent event) {
        emf.close();
    }

    public static EntityManager createEntityManager() {
        if (emf == null) {
            throw new IllegalStateException("Context is not initialized yet.");
        }

        return emf.createEntityManager();
    }

}

(Opmerking: vóór Servlet 3.0 moet deze klasse worden geregistreerd door <listener> in web.xml in plaats van @WebListener)

Welke kan worden gebruikt als:

EntityManager em = EMF.createEntityManager();
// ...

57
2017-10-22 21:40