Architecture Java Persistence API (JPA)
La persistance de données est la capacité de conserver des données entre les exécutions d'applications. La persistance est essentielle aux applications d'entreprise du fait de l'accès nécessaire aux bases de données relationnelles. Les applications développées pour cet environnement doivent gérer elles-mêmes la persistance ou utiliser des solutions tierces pour gérer les mises à jour de base de données et les extractions avec persistance. L'API Java™ Persistence (JPA) fournit un mécanisme de gestion de la persistance et du mappage objet-relationnel, ainsi que des fonctions pour les spécifications EJB.
La spécification JPA définit en interne le mappage objet-relationnel au lieu de le confier à des implémentations de mappage spécifiques à leur fournisseur. JPA est basée sur le modèle de programmation Java qui s'applique aux environnements Java EE mais peut aussi fonctionner dans un environnement Java SE à des fins de test des fonctions de l'application.
- L'API EntityManager peut rendre persistants, mettre à jour, extraire ou supprimer des objets d'une base de données.
- L'API EntityManager et les métadonnées du mappage objet-relationnel traitent la plupart des opérations de base de données sans que vous ayez à rédiger du code JDBC ou SQL pour préserver la persistance.
- JPA fournit un langage de requête qui supplémente le langage de requête EJB (connu aussi sous le nom JPQL) et que vous pouvez utiliser pour extraire des objets sans avoir à rédiger de requêtes SQL spécifiques à la base de données sur laquelle vous travaillez.
JPA est conçu pour opérer aussi bien à l'intérieur qu'à l'extérieur d'un conteneur Java Enterprise Edition (Java EE). Si vous exécutez JPA dans un conteneur, les applications pourront l'utiliser pour gérer le contexte de persistance. S'il n'existe aucun conteneur pour gérer JPA, l'application doit gérer le contexte de persistance elle-même. Les applications conçues pour la persistance gérée par conteneur requièrent moins d'implémentation de code pour gérer la persistance, mais elles ne peuvent pas être utilisées en dehors d'un conteneur. Les applications qui gèrent leur propre persistance peuvent fonctionner dans un environnement de conteneur ou dans un environnement Java SE.
- Unité de persistance
- Comprend des métadonnées déclaratives qui décrivent la relation des objets de la classe entité avec une base de données relationnelle. EntityManagerFactory utilise ces données pour créer un contexte de persistance accessible via le gestionnaire EntityManager.
- EntityManagerFactory
- Utilisé pour créer un gestionnaire EntityManager pour les interactions avec la base de données. Les conteneurs du serveur d'applications fournissent généralement cette fonction mais EntityManagerFactory est requis si vous utilisez la persistance JPA gérée par application. Une instance de gestionnaire EntityManagerFactory représente un contexte de persistance.
- Contexte de persistance
- Définit l'ensemble des instances actives actuellement manipulées par l'application. Le contexte de persistance peut être créé manuellement ou par injection.
- EntityManager
- Gestionnaire de ressources qui assure la maintenance de la collection active des objets Entity utilisée par l'application. Il traite les interactions avec la base de données et les métadonnées des mappages objet-relationnel. Une instance de gestionnaire EntityManager représente un contexte de persistance. Une application
dans un conteneur peut obtenir cet EntityManager via injection dans l'application
ou en le recherchant dans l'espace nom du composant Java. Si l'application gère sa persistance, EntityManager est obtenu de EntityManagerFactory.Attention: Injection du EntityManager n'est pris en charge que pour les artefacts suivants :
- Beans session EJB 3.x
- Beans EJB 3.x gérés par message
- Servlets, filtres Servlet et programmes d'écoute
- Gestionnaires de balises JSP qui implémentent des interfaces javax.servlet. jsp.tagext.Tag et javax.servlet.jsp.tagext.SimpleTag
- JavaServer Beans gérés par Faces (JSF)
- Classe principale du client d'application
- Objets Entity
- Une classe Java simple qui représente une ligne dans une table de base de données dans sa forme la plus simple. Les objets Entity peuvent être des classes concrètes ou abstraites. Ils tiennent à jour les états à l'aide de propriétés ou de zones.
JPA (Java Persistence API) et contextes de transaction locale
WebSphere offre à la fois des contextes de transaction globale et des contextes de transaction locale aux composants gérés. Une transaction est toujours active, qu'il s'agisse d'un contexte de transaction globale (GTC) ou d'un contexte de transaction locale (LTC) avec des unités d'exécution qui servent un composant géré. Cette transaction active n'a aucun impact sur les contextes de persistance gérés par l'application (à savoir, les composants JPA EntityManager acquis via les objets EntityManagerFactory injectés dans une application via @PersistenceUnit), mais elle en a un sur les contextes de persistance gérés par le conteneur (à savoir, les composants JPA EntityManager injectés via @PersistenceContext).
Les méthodes de l'API JPA génère tout de même une exception TransactionRequiredException comme prévu lorsqu'elles sont appelées en dehors des limites d'un contexte de transaction globale. Toutefois, tant que le contexte de transaction locale reste actif (jusqu'à ce qu'un nouveau contexte de transaction globale soit démarré ou que la fin de l'appel de service de composant soit atteinte), le contexte de persistance des transactions gérées par conteneur (CMT) reste également actif. Rester actif signifie que les entités extraites (par recherche ou interrogation) par un composant EntityManager de transactions gérées par conteneur dans les limites d'un contexte de transaction locale sont toujours gérées par ce contexte de persistance, au lieu d'être immédiatement déconnectées. Ce comportement peut surprendre du fait d'une différence de comportement inattendue par rapport à certains guides de programmation JPA. Toutefois, dès qu'un contexte de transaction globale commence, le contexte de persistance gardé actif par le contexte de transaction locale est supprimé et les entités gérées par ce contexte de persistance deviennent déconnectées.