Java Persistence API (JPA)

La persistance des données constitue pour une application un moyen de conserver et d'extraire des informations à partir d'un système de stockage rémanent. L'API JPA (Java™ Persistence API) fournit un mécanisme de gestion de la persistance et du mappage objet-relationnel et des fonctions depuis les spécifications EJB 3.0 .

Open Liberty Pour plus d'informations sur l'utilisation de JPA 2.1 et versions ultérieures avec Liberty, voir le site Web Open Liberty.

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.

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é sur le modèle de programmation Java qui s'applique aux environnements Java Enterprise Edition (Java EE), mais JPA peut fonctionner dans un environnement Java SE pour tester les fonctions d'application.

JPA représente une simplification du modèle de programmation de persistance. Elle définit explicitement le mappage objet-relationnel au lieu de le confier à des implémentations de mappage spécifiques à leur fournisseur. JPA standardise la tâche importante de mappage objet-relationnel en utilisant des annotations ou XML pour mapper des objets dans une ou plusieurs tables d'une base de données. Pour simplifier plus encore le modèle de programmation de persistance :

  • L'API EntityManager peut conserver, mettre à jour, extraire ou supprimer les objets d'une base de données.
  • Les métadonnées contenues dans le mappage objet-relationnel et l'API EntityManager traitent la plupart des opérations de base de données sans que l'écriture du code SQL ou JDBC ne soit nécessaire pour conserver la persistance.
  • JPA fournit un langage de requête, qui étend le langage de requête EJB indépendant (aussi appelé JPQL), que vous pouvez utiliser pour extraire des objets sans avoir à écrire des requêtes SQL spécifiques à la base de données avec 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 un environnement Java SE.

Les conteneurs Java EE qui prennent en charge le modèle de programmation EJB 3.x doivent prendre en charge une implémentation JPA, également appelée fournisseur de persistance. Un fournisseur de persistance JPA utilise les éléments suivants pour simplifier la gestion de la persistance dans un environnement EJB 3.x :

Unité de persistance
Définit une classe Java de mappage Object-Relational Model complète (entités + structures de support) 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 d'un EntityManagerFactory représente un contexte de persistance.
Contexte de persistance
Définit l'ensemble des instances actives actuellement manipulées par l'application. Vous pouvez créer le contexte de persistance manuellement ou via 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 d'un 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.
Objets Entity
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. Grâce à ces contextes qui sont fournis aux composants gérés et grâce aux unités d'exécution au service des composants gérés, une transaction est toujours active que ce soit dans un contexte de transaction globale ou dans un contexte de transaction locale.

Ce traitement n'a aucun effet sur les contextes de persistance gérée par application, à savoir les gestionnaires d'entités JPA acquis via les fabriques de gestionnaires d'entités injectés dans une application avec @PersistenceUnit. Cependant, il peut avoir un impact sur les contextes de persistance gérée par conteneur, à savoir les gestionnaires d'entités JPA injectés avec @PersistenceContext. Les méthodes de l'API JPA exigent qu'une exception TransactionRequiredException soit émise lorsqu'elles sont appelées hors des limites d'un contexte de transaction globale, et cette exception est toujours émise comme prévu. Toutefois, lorsque le contexte de transaction locale reste actif et 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 gérée par conteneur reste actif. Les entités qui sont extraites via une recherche ou une requête effectuée par un gestionnaire d'entités de contexte de persistance gérée par conteneur dans les limites d'un contexte de transaction locale restent gérées par ce contexte de persistance, au lieu d'être immédiatement dissociées. Suite à ce traitement, qui peut apparaître comme un comportement inattendu et sembler constituer une différence de comportement par rapport à certains guides de programmation JPA, le contexte de persistance que le contexte de transaction locale garde actif est supprimé une fois que le contexte de transaction globale démarre, et les entités gérées par ce contexte de persistance sont alors dissociées.