Читать книгу Desarrollo de aplicaciones web con Jakarta EE - César Francisco Castillo - Страница 35
2.7.5 Inserción en cascada
ОглавлениеImagine que deseamos dar de alta una nueva facultad y, junto a ella, registrar las carreras que en ella se imparten (ya que en una misma facultad se pueden impartir distintas carreras).
Podríamos pensar en invocar el método persist() tantas veces como carreras tenga la facultad en cuestión. El siguiente fragmento de código refleja esta situación:
En su lugar, lo más adecuado sería crear una lista de carreras e ir añadiéndolas una a una. Al final, invocamos el método setCarrerasList() del objeto facultad, al cual pasaremos la lista. Después, persistiremos todo junto (Facultad y Carreras) en una sola llamada al método persist(), como se puede apreciar en el siguiente fragmento de código:
Si por alguna razón no se puede insertar el objeto facultad, tampoco se insertarán las distintas carreras. De este modo, nos aseguramos de no dejar la base de datos en un estado de inconsistencia.
Para que la persistencia en cascada pueda funcionar desde Facultad hacia Carrera, debemos editar la anotación @OneToMany que define la relación e incluir la constante PERSIST de la siguiente manera:
Veamos un pequeño ejemplo de persistencia en cascada, en el cual insertamos una facultad y, junto a ella, un listado de carreras generado en un bucle.
Como en la base de datos que acompaña a este libro el último registro insertado en la tabla carreras tiene un id igual a cuarenta y cuatro (id=44), empezaremos el bucle con el número cuarenta y cinco (i=45) para no obtener errores en la inserción por duplicación de claves primarias.
ThreadLocalRandom.current().nextInt(2, 4) genera números aleatorios (solo admite como posibles valores 2 y 3) que representan el tipo de carrera (2 = grado, 3 = pregrado).
Observe que el método persist() se encuentra encerrado dentro de una transacción, ya que, de lo contrario, no se ejecutaría.
Tras la ejecución de este ejemplo se habrán insertado cinco nuevas carreras y una facultad con tan solo una llamada al método persist().
Por supuesto, en una práctica de la vida real no tendríamos que crear “a mano” uno a uno los objetos de tipo Carrera o cualquier otro tipo de objeto, sino que, tal vez, alguien ya habría creado un archivo de texto con cientos de registros y a nosotros, como programadores, nos tocaría la tarea de procesarlo, convirtiendo esos registros (filas) en un tipo de dato determinado para su posterior persistencia en una base de datos. El tema del procesamiento de archivos será analizado en el Apéndice B.