Introducción

En este tutorial, hablaremos de Hibernate y la API de persistencia de Java (JPA) – con un enfoque en las diferencias entre ellos.

Empezaremos por explorar qué es JPA, cómo se utiliza y los conceptos básicos que hay detrás.

Luego, echaremos un vistazo a cómo Hibernate y EclipseLink encajan en el cuadro.

Mapeo Objeto-Relacional

Antes de sumergirnos en JPA, es importante entender el concepto de Mapeo Objeto-Relacional – también conocido como ORM.

El mapeo objeto-relacional es simplemente el proceso de persistir cualquier objeto Java directamente a una tabla de base de datos. Normalmente, el nombre del objeto que se persiste se convierte en el nombre de la tabla, y cada campo dentro de ese objeto se convierte en una columna. Con la tabla configurada, cada fila corresponde a un registro en la aplicación.

Introducción a JPA

La API de persistencia de Java, o JPA, es una especificación que define la gestión de datos relacionales en una aplicación Java. La API traza un conjunto de conceptos que definen qué objetos dentro de la aplicación deben ser persistidos, y cómo debe persistir en ellos.

Es importante tener en cuenta aquí que JPA es sólo una especificación y que necesita una implementación para funcionar – pero más en eso más adelante.

Ahora, vamos a discutir algunos de los conceptos centrales de JPA que una implementación debe cubrir.

3.1. Entity

La clase javax.persistence.Entity define qué objetos deben persistir en la base de datos. Para cada entidad persistida, JPA crea una nueva tabla dentro de la base de datos elegida.

Además, todas las entidades elegidas deben definir una clave primaria denotada por la anotación @Id. Junto con la anotación @GeneratedValue, definimos que la clave primaria debe generarse automáticamente cuando el registro se persiste en la base de datos.

Veamos un ejemplo rápido de una entidad descrita por JPA.

@Entitypublic class Car { @GeneratedValue @Id public long id; // getters and setters}

Recuerda, esto no tendrá actualmente ningún efecto en la aplicación – JPA no proporciona ningún código de implementación.

3.2. Persistencia de campos Persistencia de campos

Otro concepto central de JPA es la persistencia de campos. Cuando un objeto en Java se define como una entidad, todos los campos dentro de ella se persisten automáticamente como diferentes columnas dentro de la tabla de la entidad.

Si hay un campo dentro de un objeto persistido que no queremos persistir a la base de datos, podemos declarar el campo transitorio con la anotación @Transient.

3.3. Relaciones

A continuación, JPA especifica cómo debemos gestionar las relaciones entre las diferentes tablas de la base de datos dentro de nuestra aplicación. Como hemos visto, JPA maneja esto con anotaciones. Hay cuatro anotaciones de relación que debemos tener en cuenta:

  1. @OneToOne
  2. @OneToMany
  3. @ManyToOne
  4. @ManyToMany

Veamos cómo funciona esto:

@Entitypublic class SteeringWheel { @OneToOne private Car car // getters and setters}

En nuestro ejemplo anterior, la clase SteeringWheel describe una relación uno a uno con nuestra clase Car de antes.

3.4. Entity Manager

Por último, la clase javax.persistence.EntityManager especifica las operaciones hacia y desde la base de datos. El EntityManager contiene las operaciones comunes de Creación, Lectura, Actualización y Eliminación (CRUD) que se persiguen en la base de datos.

Implementaciones de JPA

Con la especificación de JPA que define cómo y qué debemos persistir, ahora tenemos que elegir un proveedor de implementación que suministre el código necesario. Sin dicho proveedor, tendríamos que implementar todas las clases relevantes para cumplir con JPA, ¡y eso es mucho trabajo!

Hay un montón de proveedores para elegir, con cada uno mostrando sus propios pros y contras. A la hora de tomar una decisión sobre cuál utilizar, debemos tener en cuenta algunos de los siguientes puntos:

  1. Madurez del proyecto – ¿cuánto tiempo lleva el proveedor, y cómo de bien documentado está?
  2. Subproyectos – ¿tiene el proveedor algún subproyecto útil para nuestra nueva aplicación?
  3. Soporte de la comunidad – ¿hay alguien que nos ayude cuando acabemos con un error crítico?
  4. Benchmarking – ¿cuál es el rendimiento de la implementación?

Aunque no vamos a profundizar en la evaluación comparativa de los diferentes proveedores de JPA, JPA Performance Benchmark (JPAB) contiene una valiosa información al respecto.

Con eso fuera del camino, vamos a echar un breve vistazo a algunos de los principales proveedores de JPA.

Hibernate

En su núcleo, Hibernate es una herramienta de mapeo objeto-relacional que proporciona una implementación de JPA. Hibernate es una de las implementaciones de JPA más maduras que existen, con una enorme comunidad que respalda el proyecto.

Implementa todas las clases de javax.persistence que vimos anteriormente en el artículo, además de proporcionar funcionalidad más allá de JPA: herramientas de Hibernate, validación y búsqueda. Aunque estas APIs específicas de Hibernate pueden ser útiles, no son necesarias en aplicaciones que sólo requieren la funcionalidad base de JPA.

Echemos un vistazo rápido a lo que ofrece Hibernate con la anotación @Entity.

Aunque cumple el contrato JPA, @org.hibernate.annotations.Entity añade metadatos adicionales que van más allá de la especificación JPA. Esto permite afinar la persistencia de la entidad. Por ejemplo, veamos algunas anotaciones ofrecidas por Hibernate que extienden la funcionalidad de @Entity:

  1. @Table – nos permite especificar el nombre de la tabla creada para la entidad
  2. @BatchSize – especifica el tamaño del lote cuando se recuperan entidades de la tabla

También vale la pena señalar algunas de las características adicionales que el JPA no especifica, que pueden resultar útiles en aplicaciones más grandes:

  1. Sentencias CRUD personalizables con las anotaciones @SQLInsert, @SQLUpate y @SQLDelete
  2. Soporte para el borrado suave
  3. Entidades inmutables con la anotación @Immutable

Para profundizar en la persistencia de Hibernate y Java – dirígete a nuestra serie de tutoriales de persistencia de Spring.

EclipseLink

EclipseLink, construido por la Fundación Eclipse, proporciona una implementación de JPA de código abierto. Además, EclipseLink soporta otros estándares de persistencia como Java Architecture for XML Binding (JAXB).

En pocas palabras, en lugar de persistir un objeto en una fila de la base de datos, JAXB lo mapea en una representación XML.

A continuación, comparando la misma implementación de anotación @Entity, vemos que EclipseLink ofrece de nuevo diferentes extensiones. Mientras que no hay anotación para @BatchSize como vimos anteriormente, EclipseLink ofrece otras opciones que Hibernate no ofrece.

Por ejemplo:

  1. @ReadOnly – especifica que la entidad a persistir es de sólo lectura
  2. @Struct – define la clase a mapear a un tipo ‘struct’ de base de datos

Para leer más sobre lo que ofrece EclipseLink, dirígete a nuestra guía sobre EclipseLink con Spring.

Conclusión

En este artículo, hemos analizado la API de persistencia de Java, o JPA.

Por último, hemos explorado en qué se diferencia de Hibernate y EclipseLink.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.