1.1 Asignación de clases a tablas

Después de aprender JDBC, lo más probable es que tenga la impresión de que trabajar con una base de datos desde una aplicación Java sigue siendo un placer. ¿Y si te dijera que todo este trabajo se puede hacer 10 veces más fácil?

¿Cuál es la principal ventaja del lenguaje SQL? Este es un lenguaje declarativo: describe lo que queremos obtener y no dice nada sobre cómo hacerlo. Cómo: esta es la preocupación del servidor SQL.

El mismo enfoque se puede utilizar cuando se trabaja con bases de datos.

En un mundo ideal, podríamos simplemente escribir consultas SQL en la base de datos y, en respuesta, recibiríamos objetos Java listos para usar, o colecciones de objetos Java, si solicitamos varias piezas.

Qué puedo decir, esto es lo que pensaron varios muchachos en 2000 y decidieron escribir su propio marco ORM.

ORM significa mapeo relacional de objetos y es esencialmente un mapeo de objetos Java a consultas SQL.

A los muchachos se les ocurrió algo muy simple: cada tabla en la base de datos debe corresponder a alguna clase en la aplicación Java . En una aplicación Java, operamos con objetos, y estos objetos ya saben cómo guardarse en la base de datos.

Había tres enfoques para resolver este problema, y ​​se parecían a esto:

  1. El objeto se guarda en la base de datos y actualiza sus campos según la información de la base de datos.
  2. El objeto puede guardarse en la base de datos, pero nunca inicia este caso.
  3. El objeto contiene solo datos, y alguien lo guarda en la base de datos y lo carga desde la base de datos.

Inicialmente, dominó el primer enfoque, luego los servidores de aplicaciones y Enterprise Java Beans fueron populares. Incluso había toda una clase de beans llamados EJB de persistencia que podían guardarse en la base de datos.

Pero un día todo cambió...

1.2 Aparición de Hibernate

En 2001, se lanzó la primera versión del marco Hibernate. Era un marco muy simple, pero permitía el uso de "objetos estúpidos" ordinarios que no sabían nada acerca de cómo debían almacenarse en la base de datos o cargarse desde allí.

El mapeo de campos de clases Java y columnas en una tabla en la base de datos se estableció mediante un archivo XML. Y a veces eran bastante voluminosos. Está bien, ¿a quién estoy engañando? Eran pesados ​​lienzos de código XML. Y la situación se salvó solo por el hecho de que hace 20 años no había bases de datos tan gigantes como ahora.

Pero, de hecho, la decisión más poderosa fue finalmente separar el objeto que debe guardarse en la base de datos del código que lo guardó allí . Esta solución no es realmente obvia. Porque el principio de encapsulación establece que el objeto sabe mejor cómo debe guardarse y cargarse.

Y el enfoque ORM realmente rompe ese concepto. La clase de datos expone su estructura interna, pero se ha vuelto mucho más fácil de operar con grupos de objetos de diferentes tipos.

Un gran avance se produjo después del lanzamiento de Java 5 , cuando aparecieron dos cosas en el JDK:

  • Anotaciones
  • apoderado

AnotacionesXML fue suplantado rápidamente y ahora era fácil especificar todas las configuraciones necesarias para mapear una clase Java a una tabla en la base de datos directamente en la clase Java.

Apoderadono tan notable para el usuario de Hibernate, pero su contribución fue aún más seria. Cuando solicita un objeto u objetos específicos de Hibernate, simplemente le devuelve un stub (proxy) e intercepta todas las llamadas a sus métodos.

Esto hizo posible implementar varios mecanismos de Lazy Loading y elevó la velocidad y la eficiencia de Hibernate a un nivel completamente alto para ese momento. Hibernate se ha convertido no solo en un estándar industrial de facto, sino que ha comenzado a traducirse a otros idiomas. Así, por ejemplo, apareció Framework NHibernate para C#.

1.3 Aparición de JPA

Reconocimiento de facto seguido de jure. Los desarrolladores de JDK decidieron crear una especificación sobre cómo asignar correctamente objetos a tablas en una base de datos. Esta especificación se llamaJPA- API de persistencia de Java.

Esta es exactamente la especificación. Describe cómo debería funcionar todo y qué anotaciones necesitamos para marcar diferentes partes de la clase si queremos que sus objetos se guarden en la base de datos.

Parece que los muchachos simplemente tomaron Hibernate como base y cambiaron los nombres de los paquetes. Porque todas las anotaciones que estaban en Hibernate se movieron a JPA casi una por una.

Hoy, Hibernate implementa por completo toda la especificación JPA, así como algunas características adicionales que hacen que trabajar con él sea aún más cómodo. Por lo tanto, en términos de estandarización, podemos decir que Hibernate tiene dos conjuntos de características:

  • estándar JPA
  • API nativa de Hibernate (funcionalidad adicional)

La documentación oficial de Hibernate lo describe así:

Pero según mi experiencia y después de volver a leer la documentación de Hibernate, puedo decir que JPA y la API de Hibernate son 95% iguales. Son simplemente conceptos idénticos.

1.4 Experto para Hibernate

Como he elogiado tanto a Hibernate, creo que es hora de pasar a trabajar con él un poco más.

En primer lugar, hay un sitio oficial, donde solo hay un montón de documentación en inglés. Ella, por supuesto, tiene un sesgo en la información de referencia y no en el entrenamiento. Pero sigue siendo mejor que depurar las fuentes, ¿verdad? :)

Instrucción:

  1. Abres el enlace .
  2. La miras durante mucho tiempo.
  3. Volviendo a CodeGym.
  4. Usted lee mis conferencias adicionales.

Mi trabajo es simplificar cosas complejas y explicarlas en términos simples. Y si has alcanzado este nivel, entonces puedo hacerlo.

Bueno, para comenzar con Hibernate, debe agregarlo a su pom.xml. A la fecha ya se encuentra disponible la 6° versión de Hibernate, o mejor dicho la 6.1.1, por lo que aprenderemos a trabajar con la última versión.

Simplemente agregue estas líneas a su pom.xml:

<dependency>
	<groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
	<version>6.1.1.Final</version>
</dependency>

Si está leyendo esta conferencia fuera de la ventana de 2023+, puede descargar la nueva versión aquí .

¡Importante! Algunas de las bibliotecas que utiliza Hibernate han quedado obsoletas en JDK 11 y JDK 17, por lo que si tiene problemas para poner en marcha su proyecto, agréguele estas dependencias:

<dependency>
        <groupId>jakarta.xml.bind</groupId>
        <artifactId>jakarta.xml.bind-api</artifactId>
      	<version>4.0.0</version>
</dependency>

<dependency>
        <groupId>org.glassfish.jaxb</groupId>
        <artifactId>jaxb-runtime</artifactId>
      	<version>4.0.0</version>
</dependency>

<dependency>
        <groupId>org.javassist</groupId>
        <artifactId>javassist</artifactId>
        <version>3.29.0-GA</version>
</dependency>