cómo definir una cascada inversa de eliminación en un muchos-a-uno en el mapeo de hibernación
Pregunta
I tienen dos clases A y de B. Muchas B puede tener asociación con un único A, por lo tanto, una relación muchos-a-uno de B a A. He mapeado la relación como:
<class name="A" table="tbl_A">
<property name="propA" column="colA"/>
</class>
<class name="B" table="tbl_B">
<property name="propB" column="colB"/>
<many-to-one name="a" class="A" column="col1" cascade="delete"/>
</class>
A tiene nada asignada a B. Teniendo esto en cuenta tenemos la intención de eliminar B cuando se asocia Se elimina una. Esto podría haber sido posible si podía definir un inverse = "true" en la asociación muchos-a-uno en B, pero Hibernate no permitirlo.
¿Alguien puede ayudar con esto? No queremos escribir nada en A para esto.
Solución
Hibernate sólo cascadas a lo largo de las asociaciones definidas. Si A no sabe nada de B, nada que ver con la afectará Bs.
sugerencia de Pascal es, por lo tanto, la manera más fácil de hacer lo que quiere:
<class name="A" table="tbl_A">
...
<set name="myBs" inverse="true" cascade="all,delete-orphan">
<key column="col1"/>
<one-to-many class="B"/>
</set>
</class>
<class name="B" table="tbl_B">
...
<many-to-one name="a" class="A" column="col1" not-null="true"/>
</class>
Tenga en cuenta que la fijación de cascade="delete"
en B
como lo tiene en su código original no va a hacer lo que quiere - que le dice a Hibernate a "borrar A si se elimina B", que es probable que resulte en violación de la restricción (si hay cualquier otro B ligada a la a).
Si usted no puede agregar una colección de B a A (aunque no puedo pensar en las circunstancias en las que sería el caso), su única alternativa es definir eliminación en cascada de A a B en el extranjero nivel clave; A continuación, se borrará tu B cuando se elimina su A.
Esta es una solución bastante feo, sin embargo, ya que hay que tener mucho cuidado de cómo se elimina una de Hibernate:
- Sesión debe lavarse antes de borrar un (que tiene pendientes cambios a B puede resultar en un error o A y B en alguna de ser reinsertado detrás de las escenas)
- Todos los B vinculados a su A (y ya que no está manteniendo la relación desde un lado que significa todos B) debe ser desalojado de todas las sesiones activas y segundo nivel de caché.
Otros consejos
Creo que se necesita para cascade="all,delete-orphan"
de A a B de una asociación con one-to-many
.