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?
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.
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.
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.).