Java Persistence API (JPA)

La persistencia de datos es un medio mediante el cual una aplicación puede recuperar información desde un sistema de almacenamiento no volátil y hacer que esta persista. Java™ Persistence API (JPA) proporciona un mecanismo para gestionar la persistencia y la correlación relacional de objetos y las funciones desde las especificaciones EJB 3.0 .

Open Liberty Para obtener información sobre cómo utilizar JPA 2.1 y posterior con Liberty, consulte el sitio web de Open Liberty.

La persistencia de datos es vital en las aplicaciones empresariales debido al acceso necesario a las bases de datos relacionales. Las aplicaciones desarrolladas para este entorno deben gestionar por su cuenta la persistencia o utilizar soluciones de terceros para manejar las actualizaciones y recuperaciones de las bases de datos con persistencia.

La especificación JPA define la correlación relacional de objetos internamente, en lugar de basarse en implementaciones de correlación específicas del proveedor. JPA se basa en el modelo de programación Java que se aplica a entornos Java Enterprise Edition (Java EE), pero JPA puede funcionar dentro de un entorno Java SE para probar funciones de aplicación.

JPA representa una simplificación del modelo de programación de persistencia. La especificación JPA define explícitamente la correlación relacional de objetos, en lugar de basarse en implementaciones de correlación específicas del proveedor. JPA crea un estándar para la importante tarea de la correlación relacional de objetos mediante la utilización de anotaciones o XML para correlacionar objetos con una o más tablas de una base de datos. Para simplificar aún más el modelo de programación de persistencia:

  • La API EntityManager puede actualizar, recuperar, eliminar o aplicar la persistencia de objetos de una base de datos.
  • La API EntityManager y los metadatos de correlación relacional de objetos manejan la mayor parte de las operaciones de base de datos sin que sea necesario escribir código JDBC o SQL para mantener la persistencia.
  • JPA proporciona un lenguaje de consulta, que amplía el lenguaje de consulta EJB independiente, conocido también como JPQL, el cual puede utilizar para recuperar objetos sin grabar consultas SQL específicas en la base de datos con la que está trabajando.

JPA está diseñado para funcionar tanto dentro como fuera de un contenedor Java Enterprise Edition (Java EE). Cuando se ejecuta JPA dentro de un contenedor, las aplicaciones pueden utilizar el contenedor para gestionar el contexto de persistencia. Si no hay ningún contenedor para gestionar JPA, la aplicación debe manejar ella misma la gestión del contexto de persistencia. Las aplicaciones diseñadas para la persistencia gestionada por contenedor no requieren tanta implementación de código para manejar la persistencia, pero estas aplicaciones no se pueden utilizar fuera de un contenedor. Las aplicaciones que gestionan su propia persistencia pueden funcionar en un entorno de contenedor o en un entorno Java SE.

Los contenedores Java EE que dan soporte al modelo de programación EJB 3.x deben dar soporte a una implementación JPA, también denominada proveedor de persistencia. Un proveedor de persistencia JPA utiliza los elementos siguientes para habilitar una gestión de persistencia más fácil en un entorno EJB 3.x:

Unidad de persistencia
Define un modelo relacional de objetos completo que correlaciona clases Java (entidades + estructuras de soporte) con una base de datos relacional. EntityManagerFactory utiliza estos datos para crear un contexto de persistencia al que se puede acceder mediante EntityManager.
EntityManagerFactory
Se utiliza para crear un EntityManager para las interacciones de base de datos. Los contenedores del servidor de aplicaciones normalmente proporcionan esta función, pero es necesario EntityManagerFactory si se utiliza la persistencia gestionada por las aplicaciones JPA. Una instancia de EntityManagerFactory representa un contexto de persistencia.
Contexto de persistencia
Define el conjunto de las instancias activas que la aplicación está manipulando actualmente. Puede crear el contexto de persistencia manualmente o mediante inyección.
EntityManager
Gestor de recursos que mantiene la colección activa de objetos de entidad que está utilizando la aplicación. EntityManager maneja la interacción y metadatos de bases de datos para las correlaciones relacionales de objetos. Una instancia de EntityManager representa un contexto de persistencia. Una aplicación de un contenedor puede obtener el EntityManager a través de la inyección en la aplicación o buscándola en el espacio de nombres de componente Java. Si la aplicación gestiona su persistencia, el EntityManager se obtiene desde EntityManagerFactory.
Objetos de entidad
Clase Java simple que representa una fila de una tabla de base de datos en su forma más simple. Los objetos de entidades pueden ser clases concretas o clases abstractas. Mantienen estados mediante la utilización de propiedades o campos.

Java Persistence API y contextos de transacciones locales

WebSphere proporciona contextos de transacciones globales y locales a los componentes gestionados. Proporcionando estos contextos a los componentes gestionados y haciendo que las hebras den servicio a los componentes gestionados, una transacción siempre está activa tanto para un contexto de transacción global (GTC) como para un contexto de transacción local (LTC).

Este proceso no tiene ningún efecto en contextos de persistencia gestionados por aplicación adquiridos por EntityManagers JPA mediante EntityManagerFactories inyectados en una aplicación con @PersistenceUnit. Pero, este proceso puede afectar a los Contextos de persistencia gestionada por contenedor (CMTS), es decir, EntityManagers JPA inyectados mediante @PersistenceContext. Los métodos de API JPA necesitan que se genere una TransactionRequiredException cuando se llaman desde fuera de los límites de un GTC y esta excepción aún se genera como se esperaba. Sin embargo, mientras que el LTC permanece activo y hasta que se alcanza un nuevo GTC o el final de la invocación de servicio de componente, el contexto de persistencia de CMTS permanece activo. Las entidades que se captan utilizando una búsqueda o consulta por un EntityManager CMTS dentro de los límites de un LTC las sigue gestionando ese contexto de persistencia, en lugar de quedar desconectadas inmediatamente. Como resultado de este proceso, que puede parecer tener un comportamiento inesperado y presentar diferencias en el comportamiento con algunas guías de programación de JPA, el contexto de persistencia mantenido activo por el LTC se desecha una vez que se inicia el GTC y las entidades gestionadas por dicho contexto de persistencia quedan desconectadas.