Comment utiliser la cascade et l'inverse en hibernation? Quelle est la procédure/balise pour les définir? Sont-ils liés les uns aux autres et comment sont-ils utiles?
En cas de relation plusieurs-à-plusieurs via la table intermédiaire; "Cascade" indique si un enregistrement sera créé/mis à jour dans la table enfant. Alors que "Inverse" indique si un enregistrement sera créé/mis à jour dans la table intermédiaire
par exemple. Supposons que le scénario 1 ci-dessous indique que l'élève peut avoir plusieurs téléphones. La classe Etudiant a donc une propriété pour Ensemble de téléphones. De plus, 1 téléphone peut appartenir à plusieurs étudiants. La classe Phone a donc une propriété pour Set of Students. Ce mappage est mentionné dans la table stud_phone.
Il y a donc trois tableaux à savoir. Table Student, Phone et stud_phone (intermédiaire). La cartographie pourrait ressembler à:
<set name="phoneset" table="stud_phone" cascade="save-update" inverse="true">
<key column="mapping_stud_id">< /key>
<many-to-many class="com.domain.Phone" column="mapping_phon_id"/>
</set>
Un nouvel objet étudiant est créé et 2 nouveaux objets téléphone sont ajoutés à son ensemble. Et session.save(student_obj)
est appelé. Selon les paramètres "cascade" et "inverse", différentes requêtes seront lancées.
Vous trouverez ci-dessous différentes combinaisons de cascade et d'inverse et leur impact.
1) CASCADE IS AUCUN et INVERSE est faux
Hibernate: insert into STUDENT (Name, stud_id) values (?, ?)
Hibernate: insert into stud_phone (mapping_stud_id, mapping_phon_id) values (?, ?)
Hibernate: insert into stud_phone (mapping_stud_id, mapping_phon_id) values (?, ?)
2) CASCADE est AUCUN et INVERSE est vrai
Hibernate: insert into STUDENT (Name, stud_id) values (?, ?)
3) CASCADE est une mise à jour de sauvegarde et INVERSE est faux
Hibernate: insert into STUDENT (Name, stud_id) values (?, ?)
Hibernate: insert into phone (phone_num, phone_id) values (?, ?)
Hibernate: insert into phone (phone_num, phone_id) values (?, ?)
Hibernate: insert into stud_phone (mapping_stud_id, mapping_phon_id) values (?, ?)
Hibernate: insert into stud_phone (mapping_stud_id, mapping_phon_id) values (?, ?)
4) CASCADE est save-update et INVERSE true
Hibernate: insert into STUDENT (Name, stud_id) values (?, ?)
Hibernate: insert into phone (phone_num, phone_id) values (?, ?)
Hibernate: insert into phone (phone_num, phone_id) values (?, ?)
Comme on peut le voir, ce n'est que lorsque CASCADE a été sauvegardé-mis à jour que les enregistrements ont également été créés dans la table PHONE. Sinon non.
Lorsque INVERSE était faux (c'est-à-dire que Student était le propriétaire de la relation), la table intermédiaire STUD_PHONE a été mise à jour. Lorsque l'inverse est vrai, Phone est propriétaire de la relation, donc même si un nouvel étudiant a été créé, la table intermédiaire n'a pas été mise à jour.
Ainsi, en cas de relation de deux entités, "cascade" affecte une autre table d'entités et "inverse" affecte une table intermédiaire. Leur effet est donc indépendant.
Informations référencées depuis Différent entre cascade et inverse lien:
1. inverse: Ceci est utilisé pour décider de quel côté est le propriétaire de la relation pour gérer la relation (insérer ou mettre à jour la colonne de clé étrangère).
2. cascade: En cascade, après une opération (sauvegarde, mise à jour et suppression), il décidera s'il doit appeler d'autres opérations (sauvegarde, mise à jour et suppression) sur une autre entité qui a une relation avec l'un l'autre.
Conclusion: En bref, "l'inverse" décide quel côté mettra à jour la clé étrangère, tandis que "cascade" décide ce que l'opération de suivi doit exécuter. Les deux se ressemblent beaucoup, mais ce sont deux choses totalement différentes. Les développeurs Hibernate valent la peine de consacrer du temps à ses recherches, car une mauvaise compréhension du concept ou une mauvaise utilisation entraînera de sérieux problèmes de performances ou d'intégrité des données dans leur application.
Consultez également cette rubrique du forum: https://forum.hibernate.org/viewtopic.php?f=1&t=949041
Ce sont des concepts orthogonaux.
Dans les associations, l'un des côtés doit être marqué comme inverse en utilisant l'attribut inverse
ou l'attribut mappedBy
(côté many
dans one-to-many
/many-to-one
et de chaque côté dans l'association many-to-many
). Ces informations sont nécessaires à Hibernate pour déterminer correctement la manière dont Java classes ( association orientée objet ) sera mappée sur les tables de base de données ( association relationnelle ).
Qu'en est-il de la cascade - vous pouvez spécifier explicitement qu'Hibernate effectue des opérations sur les entités associées:
CascadeType.PERSIST
- Lorsque la méthode save()
ou persist()
est appelée pour le propriétaire, toutes les entités associées sont également enregistré;CascadeType.REMOVE
- Lorsque la méthode delete()
est appelée pour le propriétaire, toutes les entités associées sont également supprimées;CascadeType.MERGE
- Lorsque la méthode merge()
est appelée pour le propriétaire, toutes les entités associées sont également fusionnées à l'état géré/persisté;CascadeType.REFRESH
- Lorsque la méthode refresh()
est appelée pour le propriétaire, toutes les entités associées sont également actualisées à partir de leur représentation de base de données;CascadeType.DETACH
- Lorsque la session à laquelle cette entité était associée est fermée, toutes les entités liées seraient à l'état détaché;CascadeType.ALL
- Inclut toutes les opérations en cascade;