2016-05-28 5 views
3

Ich habe immer gedacht, dass @PersistenceContext zum Injizieren von EntityManager in eine Container-verwaltete Anwendung war, während @PersistenceUnit zum Injizieren einer EntityManagerFactory war.Inject eine EntityManagerFactory durch @PersitenceContext oder @PersitenceUnit?

Javadoc- sagt

Für PersistenceUnit (http://docs.oracle.com/javaee/7/api/javax/persistence/PersistenceUnit.html)

drückt eine Abhängigkeit von einer EntityManagerFactory und seiner zugehörigen Persistenzeinheit.

Und für PersistenceContext (http://docs.oracle.com/javaee/7/api/javax/persistence/PersistenceContext.html)

äußert eine Abhängigkeit von einem Container verwalteten EntityManager und der damit verbundenen Persistenzkontext.

So gut weit so, aber dann die PPV-Tutorial Ich lese (siehe https://docs.oracle.com/cd/E19798-01/821-1841/bnbqy/index.html), das ein Beispiel wie diese Das folgende Beispiel zeigt

enthält, wie Transaktionen in einer Anwendung zu verwalten, die eine Anwendung verwendet --managed EntityManager:

@PersistenceContext 
EntityManagerFactory emf; 
EntityManager em; 
@Resource 
UserTransaction utx; 
... 
em = emf.createEntityManager(); 
try { 
    utx.begin(); 
    em.persist(SomeEntity); 
    em.merge(AnotherEntity); 
    em.remove(ThirdEntity); 
    utx.commit(); 
} catch (Exception e) { 
    utx.rollback(); 
} 

so kann der PersistenceContext auch auf eine EntityManagerFactory verweisen, wenn wir über eine Anwendung verwalteten Code zu sprechen?

Haftungsausschluss - nicht auf die Antworten von dieser Frage im Zusammenhang denke ich - PersistenceUnit vs PersistenceContext

+0

suchst du noch nach einer Antwort? –

Antwort

2

ich immer gedacht habe, dass @PersistenceContext für war EntityManager in einen Container-Managed Anwendung Injektion, während @PersistenceUnit für war Injizieren einer EntityManagerFactory.

Das stimmt.

Ich denke, das Beispiel der JPA-Tutorial ist ein unvorsichtiger Fehler. Zuvor im selben Abschnitt ‚Application Managed Entity Manager‘ es

geschrieben

eine EntityManager-Instanz zu erhalten, zuerst müssen Sie eine EntityManagerFactory Instanz erhalten, indem sie in die Anwendungskomponente mittels der javax.persistence.PersistenceUnit Anmerkung Injizieren :

@PersistenceUnit EntityManagerFactory emf;

Dann einen EntityManager vom EntityManagerFactory Instanz erhalten:

EntityManager em = emf.createEntityManager();

+0

es ist nicht für EntityManager, sondern für EntityManagerFactory! – Leo