Vamos a crear y gestionar entidades de autores y libros utilizando una relación one-to-many en Java con JPA y Hibernate. Para ello, hemos preparado un programa con un método principal que contiene dos funciones: una para crear los datos y otra para imprimirlos y verificar que todo se ha guardado correctamente.
Primero definimos los autores. Por ejemplo, creamos un autor con código 1 llamado Pablo Pérez, de nacionalidad española. También tenemos a Elena Gómez, mexicana, y a Miguel López, chileno. Para simplificar, hemos decidido no incluir autores sin libros, así que nos centramos en estos tres.
A continuación, creamos los libros asociados a estos autores. Por ejemplo, el libro Programar en Java es fácil está escrito por el autor número 2, Elena Gómez. Otro libro, Cómo vestirse con estilo, pertenece al autor 3, Miguel López. También tenemos Cómo cocinar sin quemar la cocina del autor 1, y Programar en Cobol no es divertido que también es del autor 2.
Para guardar estos datos, utilizamos el método persist de JPA. Persistimos cada autor individualmente, ya que necesitamos las referencias para asociar los libros. En cambio, para los libros, como no necesitamos manipularlos después, los creamos y persistimos directamente sin asignarlos a variables. Todo esto se realiza dentro de un bloque de transacción con begin y commit, porque las operaciones fuera de una transacción pueden provocar errores o que los datos no se guarden correctamente.
Un detalle importante es asegurarnos de que las entidades estén correctamente registradas en el archivo persistence.xml. Aunque en algunos casos Hibernate puede hacer un autodescubrimiento de las clases, es recomendable incluirlas explícitamente para evitar problemas.
Para comprobar que los datos se han guardado bien, recuperamos un autor usando em.find, por ejemplo, el autor con ID 2. Al imprimir sus datos, vemos que es Elena Gómez, mexicana. Gracias a la relación one-to-many, podemos obtener la lista de libros que ha escrito con autor.getLibros(). Esto nos devuelve automáticamente todos los libros asociados a ese autor sin necesidad de hacer consultas adicionales.
Probamos esto con el autor 2 y vemos que tiene tres libros: Programar en Java es fácil, Programar en Cobol es divertido y Programar en Cobol no es divertido. También podemos hacer lo mismo con los otros autores para ver sus libros correspondientes.
Este enfoque nos permite manejar fácilmente relaciones entre entidades y trabajar con ellas de forma natural en Java, aprovechando las capacidades de JPA y Hibernate para gestionar las asociaciones y la persistencia de datos.
// Ejemplo simplificado de creación y persistencia de autores y libros
// Crear autores
Autor autor1 = new Autor(1L, "Pablo Pérez", "española");
Autor autor2 = new Autor(2L, "Elena Gómez", "mexicana");
Autor autor3 = new Autor(3L, "Miguel López", "chilena");
// Persistir autores
em.persist(autor1);
em.persist(autor2);
em.persist(autor3);
// Crear y persistir libros asociados
em.persist(new Libro(1L, "Programar en Java es fácil", autor2));
em.persist(new Libro(2L, "Cómo vestirse con estilo", autor3));
em.persist(new Libro(3L, "Cómo cocinar sin quemar la cocina", autor1));
em.persist(new Libro(4L, "Programar en Cobol no es divertido", autor2));
// Recuperar autor y obtener sus libros
Autor autor = em.find(Autor.class, 2L);
System.out.println("Autor: " + autor.getNombre() + ", Nacionalidad: " + autor.getNacionalidad());
List<Libro> libros = autor.getLibros();
for (Libro libro : libros) {
System.out.println("Libro: " + libro.getTitulo());
}
Así, podemos gestionar fácilmente la relación one-to-many entre autores y libros, asegurándonos de que los datos se guardan y recuperan correctamente dentro de transacciones, y verificando que la base de datos refleja la estructura esperada.