Fundamentos de la persistencia de objetos con JPA

La persistencia de objetos tiene como objetivo preservar el estado de los objetos (el valor de sus variables miembro incluyendo las referencias a otros objetos) de manera que este persista más allá del tiempo en el cual el objeto se encuentra en memoria (RAM). Entre las alternativas empleadas para lograr este propósito están:

  • La serialización de objetos. Consiste en convertir un objeto en una secuencia de bytes usualmente para guardarla en un archivo o transmitirla vía red. Java incluye soporte nativo para la serialización de objetos.
  • Almacenar el estado en una BD relacional/SQL. Para este propósito se recomienda usar alguna herramienta de mapeo objeto-relacional que permita asociar tablas y campos con clases y variables miembro como Hibernate o MyBatis
  • Almacenar el estado en una BD no-relacional/no-SQL. Las herramientas para realizar este cometido dependen de la forma en la que la BD no-sql almacena los datos. Por ejemplo, las BD orientadas a documentos en formato JSON como MongoDB tienen un esquema de almacenamiento mucho más compatible con los objetos que el de una BD relacional.

Java Persistence API (JPA)

JPA es una especificación técnica que describe las interfaces de programación, los componentes de configuración y el lenguaje de consulta empleado para persistir el estado de los objetos en bases de datos relacionales. Existen varias implementaciones de esta especificación[1] como Hibernate, OpenJPA y EclipseLink entre otras. Además  de implementar la especificación JPA, cada proveedor JPA ofrece funcionalidades extras en términos de facilidad de configuración, número de bases de datos soportadas, desempeño, etc. En los apartados y artículos siguientes se describen los componentes fundamentales de JPA empleado Hibernate como proveedor JPA.

Componentes JPA

La siguiente figura muestra los componentes más importante de la especificación JPA:

componentes-jpa

La Persistence Unit (Unidad de Persistencia) organiza y gestiona metadatos relacionados con la conexión a la BD, el tipo de gestión de transacción o los que describen la correspondencia (mapeo) entre clases/variables y tablas/columnas; la unidad de persistencia se define en el archivo persistence.xml conocido también como descriptor del Persistence Unit; los metadatos de mapeo se pueden expresar en dos formatos: xml y anotaciones Java.

En tiempo de ejecución, el Persistence Unit es la entrada para crear un Entity/Persistence Manager Factory (Fábrica de Gestor de Persistencia) que  su vez se usa para crear instancias de Entity/Persistence Manager (Gestor de Persistencia).

Instancias de la clase Entity/Persistence Manager son responsables de ejecutar operaciones CRUD que mueven las entidades entre la máquina virtual de Java y la base de datos relacional en un proceso conocido como el ciclo de vida de la entidad. Las operaciones realizadas por un Entity/Persitence Manager se realizan en el contexto de una transacción. En el siguiente vídeo se demuestran estos conceptos:

Una entidad es una clase Java para la cual se ha definido metadatos que asocian su estado con tablas y columnas en una base de datos relacional y cuyas instancias, por lo tanto, pueden ser gestionadas por un Entity/Persitence Manager.

Entity Manager

Además de ofrecer una interfaz que permite realizar operaciones CRUD, un Entity Manager gestiona las entidades monitoreando los cambios realizados al estado de los objetos. El conjunto de entidades gestionadas por un Entity Manager se conoce como contexto de persistencia. Finalmente, consideración de su relación con un EntityManager una entidad puede estar en alguno de los siguientes estados:

ciclo-vida-entidad

En el siguiente vídeo se demuestra este “ciclo de vida” de una entidad JPA:

 

Referencias

[1]Clases e Interfaces JPA

[2] XML para mapeo de clases

[3] Anotaciones para el mapeo de clases

 

 

[1]Conocidos también como Proveedores JPA

 

Leave a Reply