2010-08-16 13 views
30

¿Cuál es la mejor forma de eliminar todas las filas en una tabla en Hibernate?hibernar y eliminar todo

Si repito sobre una colección y llamo al session.delete(), no lo estoy ejecutando según mi conocimiento.

Si uso otra opción session.createQuery("delete ..."), no afecta el contexto de persistencia.

¿Cuándo debería utilizar estos métodos si no hay una mejor variante?

Respuesta

22
  • si usted no tiene nada que en cascada, utilice el HQL eliminar DELETE FROM enityName
  • si tiene cascadas, repetir la recogida y eliminar cada uno individualmente

El problema radica en el hecho de que hibernate maneja las cascadas internamente, en lugar de dejar esto en la base de datos. Por lo tanto, enviar una consulta no activará las cascadas internas, por lo tanto, tendrá incoherencias/huérfanos.

Si el rendimiento es tan crucial (después de todo, no es cotidiano truncar una tabla), entonces puede tener más de 1 eliminación HQL para cada cascada, es decir, manejar las cascadas manualmente.

4
String stringQuery = "DELETE FROM tablename"; 
Query query = session.createQuery(stringQuery); 
query.executeUpdate(); 
+0

¿por qué es mejor usar createQuery que iterar sobre la colección y llamar a session.delete()? ¿No podría tener problemas con el contexto de persistencia? – feiroox

+0

mejor que qué? – thelost

+3

@feiroox: Es mejor porque al iterar sobre Collection y llamar a delete, eliminará una y una fila. Este es un gran problema de rendimiento. Sin embargo, como dice Bozho, si tienes cascadas, quizás quieras hacerlo así. –

23

Puede usar HQL para la tabla truncada

public int hqlTruncate(String myTable){ 
    String hql = String.format("delete from %s",myTable); 
    Query query = session.createQuery(hql) 
    return query.executeUpdate(); 
} 
+0

Esta es la mejor manera de hacerlo –

+7

Tiene que escribir el nombre del archivo de la clase Java en la consulta, no en la tabla. –

+4

No elimina en cascada y, por lo tanto, puede violar las limitaciones de fk. – atamanroman