L'entitymanager opération de suppression est pas performant
Quand j'ai essayer de faire un entityManager.supprimer(exemple) le sous-jacent JPA fournisseur de questions qu'une opération de suppression sur chacun des GroupUser entité. J'ai l'impression que c'est pas juste d'un point de vue des performances, car si un Groupe a 1000 utilisateurs, il y aura 1001 appels émis à supprimer l'ensemble du groupe et itr groupuser entité.
Serait-il plus logique d'écrire une requête nommée pour supprimer toutes les entrées dans groupuser table (par exemple supprimer de group_user où group_id=?), je voudrais donc avoir à faire à seulement 2 appels pour supprimer le groupe.
@Entity
@Table(name = "tbl_group")
public class Group {
@OneToMany(mappedBy = "group", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@Cascade(value = DELETE_ORPHAN)
private Set<GroupUser> groupUsers = new HashSet<GroupUser>(0);
OriginalL'auteur Sam | 2010-05-17
Vous devez vous connecter pour publier un commentaire.
Réponse Simple est oui.
Si vous souhaitez supprimer un
Group
et vous savez il y a des tonnes de dossiers dansGroupUser
table, puis il est beaucoup mieux pour créer une requête de suppression qui va faire tout en un seul lot au lieu d'un et un.Si vous avez pas de cascade sur le sous-jacent de la base de données, (ou même si vous n') sa bonne pratique de le faire dans le bon ordre.
Donc supprimer les
GroupUser
premier.En supposant que vous avez un Groupe d'objet que vous souhaitez supprimer.
Le retour de type int indique le nombre de dossiers où supprimé.
Maintenant vous pouvez enfin supprimer
Group
Mise à JOUR
Semble
@OnDelete
sur le@OneToMany
fait le tourJ'ai posé une question très semblable, l'autre jour. Vous pouvez le trouver ici: stackoverflow.com/questions/2856460/... Et l'astuce d'utiliser @OnDelete au lieu de cascade pourrait peut-être dire qu'il ne veut pas supprimer les instances 1 par 1. Vous pourriez lui donner un essai. Je n'ai pas encore essayé.
fonctionne comme un charme, en quelque sorte manqué de l'utiliser. Je vous suggère d'ajouter le support pour cela aussi pour tous @OneToMany annotations.
Va faire merci 🙂
Avez-vous retiré de la cascade dans le
@OneToMany
de sorte qu'il ressemble à quelque chose comme ceci:@OneToMany @OnDelete(action = OnDeleteAction.CASCADE)
OriginalL'auteur Shervin Asgari
Depuis le
GroupUser
peut avoir des cascades ainsi, je ne pense pas qu'il y est une façon de dire à hibernate de lot-supprimer via la configuration.Mais si vous êtes certain il n'y a pas
cascade=DELETE
surGroupUser
, n'hésitez pas à émettre un HQL/JPA-QL:Si il y a des cascades, de les manipuler avec une requête.
OriginalL'auteur Bozho