Comment supprimer toutes les lignes enfants lorsque le parent est supprimé de l'utilisation d'Hibernate?
J'ai 2 tables.
//Accounts
@OneToMany(mappedBy="accounts", cascade=CascadeType.ALL)
@Cascade(org.hibernate.annotations.CascadeType.ALL)
private Set<Mails> mails;
//Mails
@ManyToOne(cascade=CascadeType.ALL)
@JoinColumn(name="user_id" , referencedColumnName="id", insertable=false, updatable=false)
private Accounts accounts;
Comment puis-je organiser la suppression de toutes les lignes enfants lorsque les parents ligne seront supprimés? J'ai essayé de mettre CascadeType.DELETE_ORPHAN
pour la Accounts
table, mais avec qui je ne peux pas supprimer des lignes parent si une ligne enfant existe.
- Pouvez-vous montrer le
show create table
MySQL de sortie pour les deux tableaux? - pastebin.com/N4y0LBmY
- La syntaxe SQL est correcte et est en accord avec ma réponse, cependant je ne vois pas le
ON DELETE CASCADE
dans la définition de clé étrangère qui est explicitement requis par le moteur InnoDB sur la table afin de permettre à automatique enfant suppressions.
Vous devez vous connecter pour publier un commentaire.
Le problème est probablement que la relation est définie dans la mauvaise direction. En supposant que vous avez un
account
table avec un-à-plusieurs rapport à unmail
table, vous finirez par ne pas être en mesure de supprimer un enregistrement deaccount
jusqu'à ce qu'il s'est associémail
lignes si vous définissez le rapport suraccount
de référencemail
. La manière correcte est de créer la clé étrangère surmail
de référenceaccount
.Avec
on DELETE CASCADE
, vous dire à MySQL qu'il devrait supprimer une ligne (dont la table a la clé étrangère) si son parent (référencée par la clé) est supprimé. Cette opération est autorisée par définition, parce que dans ce cas, l'enregistrement supprimé a des références à. En revanche, la suppression n'est pas autorisée si un enregistrement a de références pointant vers d'autres dossiers de il.ON UPDATE RESTRICT
MySQL n'autorise pas la mise à jour de la référencés champ (Comptes.id) si elle a des références. CommeON DELETE CASCADE
permet de suppression de Compte les lignes (et supprime automatiquement les lignes de Mails de référencement sur le Compte supprimé ligne),ON UPDATE CASCADE
permet de mettre à jour leid
déposé dans un Compte en ligne qui est référencé par un ou plusieurs Mail lignes (et il mettra à jour le référencement de terrain, (e-Mail.user_id) ainsi).@OnUpdate(action=OnUpdateAction.CASCADE)
. C'est juste une supposition, je ne sais vraiment pas Hibernate, a été juste essayer de vous aider au niveau SQL.Vous utilisez cascade=CascadeType.TOUS les deux entités. Essayez de l'aide que seuls les parents. Cela devrait fonctionner
La "mappedBy" propriété indique que l'autre côté est propriétaire de la relation, donc dans votre cas Mails possède la relation qui n'est probablement pas ce que vous voulez.
JPA Cascades ne fonctionnent que dans un seul sens, de la propriétaire de la relation.
Donc, si vous voulez Mails doivent être supprimés lors de la suppression d'un Compte, vous devez changer le propriétaire de la relation: