JPA + Hibernate

En esta lista de reproducción trataré JPA, una API que ofrece Java para coordinar el acceso a información persistente. Lo haré junto a Hibernate, uno de los ORMs más utilizados en el sector ahora mismo, para almacenar y recuperar información de una DBMS cualquiera como H2, MySQL o PostgreSQL.

6:01

1. La persistencia es clave

En el siglo XXI, los datos y la información se han convertido en un elemento fundamental en la sociedad. Las empresas los necesitan para sobrevivir y los usuarios domésticos los apreciamos porque toda nuestra vida digital depende de ellos. Sin embargo, almacenar información y saber que cuando se necesite estará ahí, es una tarea de ingenio porque existen muchísimas alternativas. En esta lista de reproducción os presentaré JPA, que permite coordinar el almacenamiento de información persistente e Hibernate, que permite realizar la conversión entre objetos del paradigma OOP y relaciones del paradigma relacional.

7:49

2. Instalando Hibernate

¿Y cómo harías para instalar Hibernate? (Y JPA si no estás usando un contenedor Java EE). Pues en este vídeo creo el proyecto de Maven, subo el target del compilador a la última versión de Java y agrego las librerías que me harán falta:

9:23

3. Crear el persistence.xml

Para declarar cómo acceder a la base de datos y qué driver JDBC utilizar, el archivo persistence.xml proporciona esto junto a la lista de clases que van a actuar como Entidades y otra configuración que depende de la propia implementación JPA que se esté utilizando, en este caso Hibernate.

8:13

4. Construyendo una Entity

Las anotaciones @Entity y @Table nos dejan definir las entidades en JPA a partir de un modelo JavaBean que hayamos creado. Podemos usarlo para crear una entidad y pedirle a nuestro proveedor de JPA que las almacene dentro de una tabla concreta. Dentro de esa tabla puede haber columnas, declaradas mediante la anotación @Entity. Además, no debemos olvidar el uso de @Id para declarar un identificador.

9:11

5. Accediendo al EntityManager

El EntityManager es el gestor que nos deja manipular los elementos de la base de datos, incorporando nuevos elementos u obteniendo los que ya tengamos introducidos. Podemos acceder manualmente a partir de un EntityManagerFactory o bien podemos usar un EJB si estamos en Java EE para acelerar el proceso. Una vez con el EJB, tenemos a nuestra disposición la API que nos deja introducir datos directamente proporcionándoselos al EntityManager, o bien crear consultas mediante el lenguaje JPQL.

6:38

6. Insertando con persist

Con la operación persist() se pueden insertar entidades en el almacén de datos, algo que debe hacerse dentro de transacciones para poder manipular las entidades más si nos apetece. En este tutorial os explico cómo podéis insertar un elemento mediante persist() y luego comprobamos que ha sido insertado correctamente.

6:13

7. Managed Entities

Cuando en JPA se hace la operación persist(), una entidad se vuelve Managed, es decir, JPA mantiene registrada la entidad de modo que cualquier cambio que se haga sobre una entidad afecta a lo que existe en la base de datos.

4:56

8. Merge y remove

Cuando una entidad es de tipo detached, las modificaciones a sus campos no alteran la estructura de la base de datos. Es por ello que hay que usar merge para convertirla a una entidad managed. Además, con remove podemos eliminar entidades del sistema por lo que aprovecho para contarlo.

6:34

9. Inciso sobre Java 8

Java 8 lleva un tiempo con nosotros y más de un desarrollador habrá tenido ganas de integrarlo en sus proyectos. Sin embargo, debido a que no ha habido ninguna actualización al estándar desde la publicación de Java 8, no existe nada en la normativa sobre los nuevos tipos Joda-Time incorporados como parte del paquete java.time en la versión Java 8. Así que si quieres utilizar la nueva API temporal de Java 8 vas a tener que ver este vídeo para ver qué opciones te quedan.

6:04

10. Introducción a relaciones

Relaciones perezosas (LAZY) relaciones tempranas (EAGER) y otro tipo de historias es lo que cuento en este vídeo en el que explico en breve qué tenemos que tener en cuenta al hablar de relaciones, algo que ampliaré en próximos vídeos detallando cada tipo de relación.

11:03

11. Relación OneToOne

En esta relación, declarada mediante las anotaciones @OneToOne y @JoinColumn, podemos crear una relación de tipo uno a uno en la que una instancia de una entidad tiene una relación con una instancia de otra entidad. En este vídeo os cuento un ejemplo de uso y también el error más común.

7:50

12. OneToOne inverso con mappedBy

Con el atributo mappedBy podemos crear una relación inversa que nos permita crear una relación bidireccional, de modo que podamos ir de una entidad a otra, y de otra a una. Esto en ocasiones es interesante y por ello en este episodio os cuento cómo hacerlo.

5:48

13. OneToMany: planteamiento

En este episodio os planteo en qué consiste la relación OneToMany con un ejemplo sencillo y la ayuda de mi amigo Excel. De todos modos es conveniente que sepáis de qué hablo, así que recomiendo tener experiencia sobre bases de datos.

5:57

14. OneToMany: anotaciones

Estas son las anotaciones que debes incorporar a tus entidades si quieres crear una relación OneToMany. Una de ellas deberá llevar la anotación OneToMany, y para crear el recíproco la otra deberá llevar el ManyToOne.

7:28

15. OneToMany: EntityManager

Vale, hemos visto suficiente. Veamos cómo podemos integrar esto del OneToMany/ManyToOne con nuestro EntityManager para crear instancias de entidades relacionadas y almacenarlas en el sistema.

5:25

16. ¡AYUDA! Error Lazy Initialization (OneToMany)

¿Estás recibiendo un error de tipo Lazy Initialization Error cuando obtienes una lista en una relación OneToMany de JPA? Mira este vídeo porque te explico por qué ocurre y cómo puedes arreglarlo.

8:07

17. ¡AYUDA! No se fijan las relaciones (OneToMany)

¿Haces un persist de un OneToMany pero luego tu lista te sale vacía? Mira este vídeo porque puede que estés estableciendo mal las relaciones en tu setter. En este vídeo te explico cómo puedes solucionarlo.

10:40

18. Borrar hijos en un OneToMany

Cuando tienes un OneToMany con JoinColumn, cómo haces para borrar los hijos desde el padre. Por ejemplo, hay una relación uno a muchos entre un Autor y los Libros que ha escrito o entre un Post y los Comentarios que tiene. ¿Cómo hago para desconectar y luego borrar un Comentario del Post al que pertenece?

7:34

19. ON DELETE SET NULL

¿Cómo replicar una cascada de este tipo en Hibernate? Como tal Hibernate no la ofrece. Si tenemos acceso a la base de datos lo suyo sería establecer manualmente la cascada para que cuando se borre un elemento, sus claves foráneas se pongan a NULL. O, manualmente nullificar las filas antes de borrarlas.