Comment lot à supprimer à l'aide bulkUpdate
J'ai une commune de l'Utilisateur /Rôle de l'installation, avec un user_role de la table de jointure. Je suis en train d'utiliser le Printemps HibernateTemplate à la messe de supprimer tous les utilisateurs bloqués comme ceci:
getHibernateTemplate().bulkUpdate("delete from User where locked=?", true);
Si l'utilisateur supprimé n'a pas les rôles (pas d'enregistrement dans la user_role tableau), alors tout va bien; toutefois, si l'utilisateur a un rôle d'enregistrement, j'obtiens l'erreur suivante:
contrainte d'intégrité violé l'enfant
enregistrement
Rôles sont définis dans User.java comme ceci:
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "user_role", joinColumns = { @JoinColumn(name = "user_id") }, inverseJoinColumns = @JoinColumn(name = "role_id"))
private Set<Role> roles = new HashSet<Role>();
Alors, comment puis-je lot de supprimer des utilisateurs même si un utilisateur a des enregistrements enfants? Merci!
OriginalL'auteur SamS | 2009-04-09
Vous devez vous connecter pour publier un commentaire.
En vrac les opérations de suppression ne sont pas en cascade à entités liées conformément à la spécification JPA:
Toutefois, je m'attends à de la JPA fournisseur de traiter avec les tables de jointure. Malheureusement, Hibernate ne l'est pas et cela est consigné dans HHH-1917. Je crains que vous devrez revenir sur SQL natif de nettoyer la table de jointure vous-même ou pour l'utilisation en cascade des clés étrangères dans le schéma.
OriginalL'auteur Pascal Thivent
Au niveau de l'Application en cascade (cascading par hibernate annotations ou des annotations JPA) ne fonctionne que si l'entité réelle est en fait chargé de la db. Lorsque vous utilisez la veille prolongée modèle avec HQL, vous remarquerez que les entités ne sont pas chargés, et le HQL est directement converti à SQL à exécuter.
Si vous voulez des lots supprimer, vous devez utiliser une requête HQL pour supprimer toutes les tables (c'est à dire rôles) avant de les supprimer de la table parent de données.
Vous ne pouvez pas utiliser les requêtes HQL de gérer les non-cartographiée entités. Je vous conseille de carte de la user_role table; l'alternative est d'utiliser du SQL pour supprimer à partir de la user_role table.
OriginalL'auteur Miguel Ping
Je ne suis pas entièrement sûr, parce que c'est difficile pour moi de recréer ce problème, mais je pense que vous pourriez avoir besoin d'ajouter une cascade à votre @ManyToMany
Non, une suppression en bloc n'est pas cascade d'entités liées par spécification JPA.
OriginalL'auteur Greg Noe
Puisque vous voulez supprimer en vrac quelque chose qui ont un ManyToMany éléments connexes, vous devez d'abord supprimer la relation (dans la table de jointure), ou de faire une boucle et pour chaque article, de supprimer manuellement (fou et trop lourd).
Donc, depuis JPQL ne permet pas de le faire, une solution possible est de faire un natif SQL de la requête pour la suppression de l'identifiant dans la table liée, et puis, ne le supprimer en vrac.
OriginalL'auteur Cyril N.