PersistenceUnit vs PersistenceContext

dans peu de projets j'ai utilisé avec succès

@PersistenceUnit(unitName = "MiddlewareJPA")
EntityManagerFactory emf;
...
EntityManager entityManager = emf.createEntityManager();

obtenir EntityManager pour la connexion à la base de données, mais il y a quelques jours j'essayais de déplacer mon projet à Jboss EAP 6.2 et il ne pouvait pas créer EntityManager. J'ai été sur google et j'ai trouvé que je devrais essayer de changer @PersistenceUnit

@PersistenceContext(unitName = "MiddlewareJPA")
private EntityManager entityManager;

obtenir EntityManager. Il a travaillé, mais je ne sais pas pourquoi. Quelle est la différence bettween PersistenceUnit et <!--7? Quels sont les avantages et les inconvénients de chacun? Où devrions-nous être à l'aide de l'un d'eux?

38
demandé sur informatik01 2014-01-10 11:45:27

3 réponses

Je ne sais pas comment cela fonctionne exactement dans le Java EE, mais au printemps, quand vous spécifiez @PersistenceContext annotation, il injecte EntityManager. Où fait-il EntityManager? Il est faux de créer un EntityManager pour toute la durée de vie de l'application en appelant EntityManagerFactory.createEntityManager(). Donc à la place une implémentation spéciale de EntityManager interface est utilisée et instanciée directement. Il a un thread interne mutable-référence locale à un réelEntityManager. Les implémentations de méthodes redirigent simplement les appels vers ceci réelEntityManager. Et il y a un écouteur servlet, qui avant chaque requête obtient EM en appelant EMF.createEntityManager() et assignez - le à cette référence intérieure de spécial EM. De plus, cet auditeur gère les transactions en appelant getTransaction().begin(),.commit() et .rollback() sur le réelEM. Il s'agit d'une description très simplifiée du travail accompli. Et je crois que JEE container fait la même chose que le printemps.

Dans le cas général, il est préférable d'injecter EntityManager, parce que avec EntityManagerFactory et @PersistenceUnit vous devez créer/détruire EntityManager chaque fois à la main et gérer les transactions aussi.

35
répondu Alexey Andreev 2014-01-10 10:19:05

PersistenceUnit injecte un EntityManagerFactory et PersistenceContext injecte un EntityManager. Il est généralement préférable d'utiliser PersistenceContext sauf si vous avez vraiment besoin de gérer le EntityManager cycle de vie manuellement.

51
répondu chrylis 2014-01-10 07:50:42

EntityManager obtenu à l'aide de @PersistenceContext est appelé Container Managed EntityManager en tant que conteneur sera responsable de la gestion " EntityManager". EntityManager obtenu à l'aide de @Persistencenceunit / entityManagerFactory.createEntityManager () est géré dans l'application par le développeur. (pour la gestion du cycle de vie de EntityManager, libérant les ressources acquises par L'EntityManager, etc.).

7
répondu Raj 2018-08-28 17:05:23