web-dev-qa-db-fra.com

hiberner et supprimer tout

Quelle est la meilleure façon de supprimer toutes les lignes d'un tableau dans Hibernate?

Si j'itère une collection et appelle session.delete(), cela ne fonctionne pas à ma connaissance.

Si j'utilise une autre option session.createQuery("delete ...") cela n'affecte pas le contexte de persistance.

Quand devrais-je utiliser ces méthodes s'il n'y a pas de meilleure variante?

33
feiroox
  • si vous n'avez rien à mettre en cascade, utilisez la suppression HQL DELETE FROM enityName
  • si vous avez des cascades, parcourez la collection et supprimez chacune individuellement.

Le problème réside dans le fait que la mise en veille prolongée gère les cascades en interne, plutôt que de laisser cela à la base de données. Ainsi, l'envoi d'une requête ne déclenchera pas les cascades internes, vous aurez donc des incohérences/orphelins.

Si les performances sont si cruciales (après tout, ce n'est pas tous les jours que l'on tronque une table), vous pouvez avoir plus de 1 suppression HQL pour chaque cascade - c'est-à-dire gérer les cascades manuellement.

24
Bozho

Vous pouvez utiliser HQL pour tronquer la table

public int hqlTruncate(String myTable){
    String hql = String.format("delete from %s",myTable);
    Query query = session.createQuery(hql)
    return query.executeUpdate();
}
String stringQuery = "DELETE FROM tablename";
Query query = session.createQuery(stringQuery);
query.executeUpdate();
6
thelost