Estoy tratando de eliminar un gran número de filas de MOTHER
gracias a una consulta JPQL.JPA: ELIMINAR DONDE no se elimina a los niños y se lanza una excepción
La clase Mother
se define como sigue:
@Entity
@Table(name = "MOTHER")
public class Mother implements Serializable {
@OneToMany(cascade = CascadeType.ALL, mappedBy = "mother",
orphanRemoval = true)
private List<Child> children;
}
@Entity
@Table(name = "CHILD")
public class Child implements Serializable {
@ManyToOne
@JoinColumn(name = "MOTHER_ID")
private Mother mother;
}
Como se puede ver, la clase Mother
tiene "hijos" y al ejecutar la siguiente consulta:
String deleteQuery = "DELETE FROM MOTHER WHERE some_condition";
entityManager.createQuery(deleteQuery).executeUpdate();
se produce una excepción:
ERROR - ORA-02292: integrity constraint <constraint name> violated -
child record found
Por supuesto, podría primero se Lectura de todos los objetos que quiero eliminar y recuperarlos en una lista antes de iterar a través de ella para eliminar todo el objeto recuperado, ¡pero el rendimiento de tal solución sería terrible!
Entonces, ¿hay una manera de tomar ventaja de la asignación anterior para eliminar todos los objetos y Mother
todos los Child
objetos asociados con ellos de manera eficiente y sin necesidad de escribir primero las consultas para todo los niños?
Lamentablemente esto anula las ventajas de rendimiento de la mayor borrar y para implementar esta solución en otra cosa que una situación de juguete que se necesita para envolver el SelectQuery en una infraestructura de paginación que borra el entermanager por página para evitar quedarse sin memoria con un gran número de Madres. – NBW
Me estremezco cada vez que veo las llamadas a la base de datos en bucles. ¡Es MUY lento, consume muchos recursos e ineficiente! ¡Siempre hay una mejor manera! :) – PAULUS
En realidad, usualmente EntityManager.remove() todavía no llama a la base de datos, esto ocurre más tarde durante el tiempo de vaciado/confirmación. –