J'ai deux entités appelées utilisateur et userProfile dans mon modèle de données. Voici comment ils sont mappés.
Code de l'entité utilisateur: p> code de UserProfile entité: p> Comme vous le voyez, j'ai un Voici ma question: - P> cascadetype.all code> pour l'attribut utilisateur dans userprofile. Mais lorsque j'essaie de supprimer l'entité UserProfile, l'entité utilisateur correspondante reste toujours. (Lorsque j'essaie de supprimer l'entité utilisateur, l'entité utilisatrice correspondante est supprimée.) P>
4 Réponses :
comme dit
Lorsque j'essaie de supprimer l'entité UserProfile, l'entité utilisateur correspondante reste toujours p> BlockQuote>
Peut-être que lorsque vous essayez de supprimer un ussurofile, vous obtenez une violation de la contrainte d'intégrité de la base de données - utilisez-vous Myisam Moteur dans MySQL? P>
Mais comme vous ne le dit pas. Peut-être que votre entité UserProfile n'a pas de référence à une entité utilisateur. p>
comme dit dans la spécification JPA P>
Supprimer l'opération
est en cascade sur des entités référencées par x fort>, si la relation de x à ces autres entités est annotée avec la cascade = supprimer ou cascade = toute la valeur d'élément d'annotation p> blockquote> quelque chose comme p>
xxx pré> ou que vous avez quelque chose comme p>
xxx pré> en réponse au commentaire de Chhsply: P>
en persistance Java avec livre hibernate, vous voyez le suivant P>
L'attribut CASCADE est directionnel: Il s'applique à une seule extrémité de l'association forte>. p> blockQuote>
Je pense que ce serait mieux comme p>
Il s'applique à une seule extrémité de l'association par opération em> p> BlockQuote>
Pour que vous puissiez mettre un attribut cascade des deux côtés en même temps, même dans une relation bidirectionnelle. SO CHSSPLY a raison. P>
Attribut Mappdeby met en place la relation bidirectionnelle forte>. Attribut Mappede désigné l'entité d'adresse comme le côté inverse de la relation. Cela signifie que l'entité client est le côté de la relation de la relation. P>
CHSSPLY est juste quand il dit mappéby n'a rien à voir avec la cascade EM> P> P> P>
C'est incorrect. Tout d'abord, mappeby code> n'a rien à voir avec la cascade - il est utilisé pour signifier le côté non propriétaire de la relation bidirectionnelle. Deuxièmement, l'attribut "cascade" est un attribut b> (comme dans "pas une association"), il n'est donc pas unidirectionnel ou bidirectionnel en soi. Il peut être appliqué à une association unidirectionnelle ou bidirectionnelle (y compris les deux côtés simultanément). Certains types de cascade B> peuvent ne pas avoir de sens sur le côté de l'association non propriétaire.
Merci, chssply. Comme je suis un président anglais non autochtone, j'ai des limitations lors de la rédaction de la réponse. Ajouté à la réponse originale.
@Arthur - merci pour vos modifications (upvoting); Je ne voulais pas être dur ou nitpick à Phrases - je voulais juste clarifier certains points. L'anglais n'est pas ma première langue non plus :-)
@ Arthur..Je suis confus ... Je l'ai testé à nouveau, mais c'est toujours la même chose. Je l'ai testé avec un bidirectionnel plusieurs à plusieurs aussi, et les cascades du côté appartenant à la relation semblent avoir aucun effet (ma table de jointure ne se met pas à jour). Êtes-vous sûr que les cascades peuvent être spécifiées de chaque côté d'une relation bidirectionnelle? BTW, j'utilise JPA et non hibernate, s'il a quelque chose à faire ... et merci ... vous êtes toujours très utile et élaboré.
@sontobeared comme dit par CHSSPLY, MappedBy n'a rien à voir avec la cascade. Vous pouvez utiliser une cascade des deux côtés en même temps, même avec une relation bidirectionnelle. Si votre code n'a rien à voir avec ma réponse, votre fournisseur JPA peut donc ne pas être en fonction de la spécification JPA. Si possible, indiquez le code utilisé pour supprimer l'instance utilisateur et UserProfile. Cordialement,
C'est correct lorsque vous avez une relation bidirectionnelle, le propriétaire dicte les règles en cascade puisqu'il s'agit du "propriétaire". L'entité "appartenante" suit essentiellement les ordres, il ne peut pas donner les ordres - afin de parler. P>
Votre question est fausse d'elle-même en soi, ce qui est là où la confusion découle de. Arthur a fait un bon travail avec sa réponse, mais il est clair des commentaires que la confusion reste toujours alors laissez-moi prendre un coup de poignard ici. P>
Les cascades ne contiennent que lorsque je spécifie eux sur l'entité possédant la relation? p> blockQuote>
"cascade" est un attribut que vous spécifiez sur un (ou éventuellement à la fois en cas de fin de relation entre une relation. Il détermine quelles actions fortes> effectuées sur que forte> fin seront propagées à l'extrémité
autre forte>. Il y a de nombreux types différents de ces actions définies dans JPA et Encore plus défini dans les extensions hibernate. Cette distinction est importante - vous ne devriez parler que Comportement spécifique Strong> propagée et non "Cascade" en général. P> persiste, fusionner, rafraîchir la propagation normalement (de la fin, ils ont été déclarés sur l'autre). P>
Supprimer, cependant, est délicat car cela peut signifier deux choses différentes. Si vous avez une relation entre
A fort> et B fort> et que vous essayez de supprimer A fort>, vous pouvez supprimer B forte > À l'autre extrémité ou vous pouvez supprimer l'association forte> mais laisser b fort> intact. Hibernate fait une distinction claire entre les deux - vous pouvez déclarer supprimer (Supprimer) et delete_orphan code> types de cascade séparément; JPA Spec ne le fait pas. Notez que
delete_orphan code> n'est pas pris en charge sur des relations à la seule valeur (OneSoOne / MétéoTone). P>
Ainsi, la propagation de la suppression (par elle-même ou quand elle fait partie de tout) dépend de la question de savoir si une relation a un propriétaire clair (uni-directionnel le fait toujours; bidirectionnel fait s'il est mappé en utilisant mappé strong> et ne peut pas si elle est mappée via
Table de jointure forte>) auquel cas il est propagé du propriétaire à posséder ou aucun propriétaire dans quel cas il est propagé dans les deux sens mais sans Delete_orphan Code> Sémantique à moins que ce soit explicitement spécifié. Un exemple typique de ce dernier est Bi-directionnel plusieurs à plusieurs. P>
Bonjour CHSS, j'ai essayé ici et travaille bien - OneToone et MétéoTomanany. Bien que j'ai utilisé Hibernate, je pense que cela fonctionne de la même manière en JPA, car Hibernate est un surset de la JPA. Je pense qu'il serait préférable que Sonobared avait montré le code où il essaie de supprimer UserProfile et son entité utilisateur référencée. Peut-être qu'une violation de contrainte est lancée par l'application et l'entité utilisateur référencée n'est pas supprimée. Encore une fois, il est difficile de supposer ce que c'est arrivé. Cordialement,
... non. Hibernate est une mise en œuvre de la JPA, cela n'a rien à voir avec un "superset" - cela n'a rien de sens
Ce serait bien si vous mettez à jour votre réponse pour refléter le comportement orphelin actuel de la JPA 2.
avec jpa 2.x, si vous voulez une cascade Supprimer, utilisez l'attribut Cochez la documentation ici pour plus d'informations . p> orphanremoval code>: p>
@Eonetomany (Orphanremoval = true) code> p>
Vos propres preuves suggéreraient que la réponse est «oui»
@skaffman ..... donc, est-ce la seule raison derrière le concept de propriétaire et de propriété? Ou y a-t-il d'autres? Merci.