miércoles, 9 de marzo de 2016

¿Por qué hibernate/JPA no borra los registros hijos?

Este es un error antiguo y más bien básico pero tiene su aquel. El caso es el siguiente:
  • Tenemos una tabla Padre que puede tener de 1 a N registros de la tabla Hijo asociados.

 
  • Tenemos configurado las clases correctamente con JPA. Y en la clase Padre hemos indicado que contiene un conjunto de objetos Hijos, e indicamos esta relación con la anotación 'OneToMany'.
@OneToMany(mappedBy="padre_pk")
public List getHijos() { ... }

Según lo que conocemos de JPA. Si un padre tiene un listado de hijos, borramos uno de ellos y hacemos una operación de 'update' sobre el objeto padre. JPA debería encargarse de actualizar los datos del registro y además borrar la relación padre-hijo eliminada.

Pero esta configuración no es suficiente, y al realizar el update cambiara los datos de la tabla padre pero no borrará las relaciones de la tabla hijo que se hayan eliminado. Para ello hay que realizar el siguiente cambio en la configuración JPA:

@OneToMany(mappedBy="padre_pk", orphanRemoval="true")
public List getHijos() { ... }

Con esta configuración al realizar el update ya borrara aquellos hijos que se queden 'huerfanos'. 

Duda extra: ¿Porque no funciona si además en la anotación OneToMany se indico anteriormente 'cascade=CascadeType.ALL' o 'cascade=CascadeType.REMOVE'? 

Pues porque esa configuración solo nos permite borrar los hijos asociados a un registro padre, cuando es el propio padre el que se borra.

No hay comentarios:

Publicar un comentario