Cascada de (N) Hibernate, que normas se necesitan?
-
19-09-2019 - |
Pregunta
Lo siento si esto es una víctima, no podía encontrar, pero el realmente sabe qué buscar, de todos modos ...
Tengo tres clases, Parent
, Child
y Other
Parent
tiene muchas Child
donde el niño tiene una columna Parent_Id
Other
contiene una referencia a un Child
través de una columna Child_Id
Cuando elimino un Parent
, también quiero eliminar todos los objetos Child
asociados. Si estos objetos son referenciados por Child
ninguna clase Other
, quiero sus objetos (los) Other
referencias Child_Id
a ser anuladas.
¿Qué reglas en cascada necesito en las dos relaciones?
Además, se actualizará entidades de NHibernate en memoria, así como en la base de datos?
es decir. si tengo un montón de Parent
, Child
y Other
en la memoria (es decir, cargado de db, no transitoria) y decirle NH eliminar un Parent
, ¿qué pasará? Asumo los objetos Parent
y Child
llegarán a ser transitoria? ¿Qué pasará con la propiedad de cualquier objeto Child
Other
?
Editar: cuando se usa All-delete-orphan, lo que las clases un objeto como un huérfano? En el ejemplo anterior, es un Child
un huérfano si se elimina su Parent
padres? Hace la referencia de la materia Other
cuando se considera una entidad como huérfanos?
Gracias
Solución
NH no actualiza ninguna de sus entidades en la memoria (a excepción de las identificaciones y las versiones). NH no se hace responsable de gestionar las relaciones de ustedes entidades. Sólo persiste lo que hizo en la memoria de la base de datos.
Desde este punto de vista debería ser más fácil de entender.
cascade="delete"
significa que cuando se elimina el padre, el niño se elimina también.
cascade="delete-orphan"
medios, que, además, el niño es incluso eliminar si no hay referencias de padres más. Esto, por supuesto, sólo funciona si el niño está en la sesión.
La instancia de borrado se transitoria en la memoria. Las referencias a la instancia transitoria (de Other
) causarán una excepción. Que yo sepa, es necesario eliminar la referencia a los casos eliminados por sí mismo. Es probable que pueda hacerlo implícita por parte de algunos trucos, pero dudo que esto será limpio. Es la lógica de negocio.
Para las relaciones entre padres e hijos, cascade="all-delete-orphan"
es apropiado.
Como referencia regulares prefiero cascade="none"
.