cómo definir una cascada inversa de eliminación en un muchos-a-uno en el mapeo de hibernación

StackOverflow https://stackoverflow.com/questions/1715146

  •  19-09-2019
  •  | 
  •  

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.

¿Fue útil?

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:

  1. 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)
  2. 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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top