Einen Verweis auf EntityManager in Java EE-Anwendungen mit CDI abrufen

Ich bin mit Java EE 7. Ich würde gerne wissen, was ist der richtige Weg, um zu injizieren, eine JPA EntityManager in eine application scoped CDI-bean. Sie können nicht nur injizieren Sie mit @PersistanceContext Anmerkung, weil EntityManager Instanzen sind nicht thread-sicher. Nehmen wir an, wir wollen, dass unsere EntityManager erstellt zu Beginn jeder HTTP-request-Verarbeitung und-geschlossen, nachdem die HTTP-Anfrage bearbeitet wird. Zwei Optionen kommen mir in den Sinn:

1.
Erstellen eines request-scoped CDI-bean, die einen Verweis auf eine EntityManager und dann injizieren Sie die Bohne in ein application-scoped CDI-bean.

import javax.enterprise.context.RequestScoped;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

@RequestScoped
public class RequestScopedBean {

    @PersistenceContext
    private EntityManager entityManager;

    public EntityManager getEntityManager() {
        return entityManager;
    }
}

import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;

@ApplicationScoped
public class ApplicationScopedBean {

    @Inject
    private RequestScopedBean requestScopedBean;

    public void persistEntity(Object entity) {
        requestScopedBean.getEntityManager().persist(entity);
    }
}

In diesem Beispiel wurde ein EntityManager werden erstellt, wenn der RequestScopedBean erstellt wurde, und geschlossen, wenn der RequestScopedBean zerstört wird. Jetzt konnte ich verschieben, die Injektion zu einer abstrakten Klasse, um es zu entfernen aus der ApplicationScopedBean.

2.
Erstellen Sie einen Hersteller, der produziert Instanzen von EntityManager, und dann Spritzen Sie die EntityManager Instanz in einer Anwendung scoped CDI-bean.

import javax.enterprise.context.RequestScoped;
import javax.enterprise.inject.Produces;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

public class EntityManagerProducer {

    @PersistenceContext
    @Produces
    @RequestScoped
    private EntityManager entityManager;
}

import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
import javax.persistence.EntityManager;

@ApplicationScoped
public class ApplicationScopedBean {

    @Inject
    private EntityManager entityManager;

    public void persistEntity(Object entity) {
        entityManager.persist(entity);
    }
}

In diesem Beispiel werden wir haben auch eine EntityManager erstellt wird jeder HTTP-request, aber was schließen die EntityManager? Wird es auch geschlossen wird, nachdem die HTTP-Anfrage bearbeitet wird? Ich weiß, dass die @PersistanceContext annotation injiziert container-managed EntityManager. Dies bedeutet, dass ein EntityManager geschlossen werden, wenn ein client eine bean zerstört wird. Was ist eine client-bean in dieser situation? Ist es die ApplicationScopedBeandie nie zerstört werden, bis die Anwendung beendet, oder ist es die EntityManagerProducer? Irgendwelche Tipps?

Ich weiß, ich könnte ein stateless EJB, statt von application-scoped bean und dann einfach Spritzen EntityManager durch @PersistanceContext Anmerkung, aber das ist nicht der Punkt 🙂

InformationsquelleAutor der Frage Flying Dumpling | 2013-10-17

Schreibe einen Kommentar