Je pense que j'ai mal compris le sens de la cascade dans le contexte d'une @ManyToOne
relation.
L'affaire:
public class User {
@OneToMany(fetch = FetchType.EAGER)
protected Set<Address> userAddresses;
}
public class Address {
@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
protected User addressOwner;
}
Quelle est la signification du cascade = CascadeType.ALL
? Par exemple, si je supprime une certaine adresse de la base de données, comment le fait que j'ai ajouté cascade = CascadeType.ALL
affecte-t-il mes données (le User
, je suppose)?
la source
Voir ici pour un exemple tiré des documents OpenJPA.
CascadeType.ALL
signifie qu'il fera toutes les actions.Citation:
Sébastien
la source
Comme je l'ai expliqué dans cet article et dans mon livre, Persistance Java haute performance , vous ne devriez pas utiliser
CascadeType.ALL
dessus@ManyToOne
car les transitions d'état d'entité doivent se propager des entités parent aux entités enfant, et non l'inverse.Le
@ManyToOne
côté est toujours l'association enfant car il mappe la colonne de clé étrangère sous-jacente.Par conséquent, vous devez déplacer le
CascadeType.ALL
de l'@ManyToOne
association au@OneToMany
côté, ce qui devrait également utiliser l'mappedBy
attribut car il est un à plusieurs le plus efficace cartographie des relations de table .la source
De la spécification EJB3.0 :
Ainsi, en résumé, les relations d'entité définies avec
CascadeType.All
garantiront que tous les événements de persistance tels que persister, actualiser, fusionner et supprimer qui se produisent sur le parent seront transmis à l'enfant. La définition d'autresCascadeType
options offre au développeur un niveau de contrôle plus granulaire sur la façon dont l'association d'entités gère la persistance.Par exemple, si j'avais un livre d'objets contenant une liste de pages et que j'ajoute un objet de page dans cette liste. Si l'
@OneToMany
annotation définissant l'association entre le livre et la page est marquée commeCascadeType.All
, la persistance du livre entraînerait la persistance de la page dans la base de données.la source
Dans JPA 2.0, si vous souhaitez supprimer une adresse si vous l'avez supprimée d'une entité utilisateur, vous pouvez l'ajouter
orphanRemoval=true
(au lieu deCascadeType.REMOVE
) à votre@OneToMany
.Plus d'explications entre
orphanRemoval=true
etCascadeType.REMOVE
est ici .la source
Si vous souhaitez simplement supprimer l'adresse attribuée à l'utilisateur et ne pas affecter la classe d'entité utilisateur, vous devriez essayer quelque chose comme ça:
De cette façon, vous n'avez pas à vous soucier de l'utilisation de la récupération dans les annotations. Mais n'oubliez pas que lors de la suppression de l'utilisateur, vous supprimerez également l'adresse connectée à l'objet utilisateur.
la source