Pregunta

Estoy sligthly confundido en cuanto a cómo funciona la "borrar" la cascada =. He definido el mapeo de la siguiente manera en el archivo de asignación Ciudad:

<set inverse="true" name="client" cascade="delete">
  <key>
    <column name="id_name"/>
  </key>
    <one-to-many class="model.Client"/>
 </set>

El cliente de clase tiene una clave externa a una ciudad de clase.

Así que cuando corro:

List object = null;
try {
   org.hibernate.Transaction tx = session.beginTransaction();
   try {
       session.delete("from City where row_id=" + row_id and table_id = " + table_id);
   } catch (Exception e) {
       e.printStackTrace();
   }
}

Deben todos los clientes sea también eliminado o tengo que manejar de alguna manera? ¿Estoy pasando la consulta como un parámetro de método correctamente al método delete () de una sesión? Gracias por cualquier ayuda. Atentamente, Sass.

¿Fue útil?

Solución

Estoy un poco confundido en cuanto a la forma en la cascada = "borrar" las obras (...)

Cascading un medio de operación delete que si delete un padre, la operación se propaga a lo largo de la asociación. Así, en su caso, la supresión de una entidad City debe ser propagado a los Clients.

Así que cuando corro (...) En caso de que todos los clientes pueden eliminar así

El método Session#delete(String) que toma un HQL cadena de consulta , lo ejecuta, itera sobre los resultados y las llamadas Session#delete(Object) en cada cascada objeto respeto (por lo que se eliminarán los clientes si la consulta es en realidad una consulta HQL ).

Sin embargo, este método es antiguo y ya no se utiliza en Hibernate 3 (y se trasladó a la interfaz Session "clásico"), no lo recomiendo de verdad (que realiza 1 + N operaciones y es bastante ineficaz para eliminar un gran número de resultados).

Si esto es una preocupación, prefieren la granel eliminar apoyo ofrecido por Hibernate:

int deleteCount = session.createQuery("delete from Foo where bar = :bar") 
    .setParameter("bar", bar);
    .executeUpdate()

Pero tenga en cuenta que la mayor parte de eliminar tiene restricciones:

  • No se puede utilizar alias.
  • No combinaciones internas en la consulta (aunque se puede utilizar subconsultas en la cláusula where).
  • mayor borrado no está disponible en cascada (y no se hará cargo de unir tablas).

Así, con una mayor eliminación, tendría que eliminar la Client antes de la City. Sin embargo, las actuaciones son mucho mejor.

PS: Es necesario commit() en algún momento (y también a mejorar el manejo de errores es decir rollback() en el bloque catch)

Referencias

Otros consejos

  1. Si elimina alguna ciudad, todos los clientes se eliminará también. Si elimina un cliente, la ciudad se quedará solo.

  2. session.delete() no puede ser llamado con una consulta HQL. Debe pasar una ciudad a eliminar.

Como alternativa, se puede utilizar para crear un session.createSQLQuery() instrucción de eliminación. Eso le permite borrar muchas ciudades en una sola vez. El inconveniente de este método es que se debe eliminar los clientes a sí mismo y vaciar la caché (Hibernate no hace ningún intento de entender lo que podría significar la consulta).

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