Quelle est la différence entre cascade et inverse en hibernate, à quoi servent-ils?

Comment utiliser cascade et inverse en hibernate? Quelle est la procédure / balise pour les définir? Sont-ils liés les uns aux autres et comment sont-ils utiles?

33
demandé sur rd22 2010-09-08 15:49:48

2 réponses

En cas de relation plusieurs à plusieurs via une 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 le scénario ci-dessous 1 étudiant peut avoir plusieurs téléphones. Donc, la classe Étudiante a la propriété pour L'ensemble des téléphones. Aussi 1 téléphone peut être détenue par plusieurs étudiants. Donc, la classe de téléphone a la propriété pour L'ensemble des étudiants. Ce mappage est mentionné dans stud_phone table.

Il y a donc trois tables à savoir. Étudiant, téléphone et stud_phone (intermédiaire) table. Le mappage peut 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 de 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 déclenchées.

Ci-dessous sont différentes combinaisons de cascade et inverse et leur impact.

1) CASCADE est NONE et INVERSE est false

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 save-update et INVERSE est false

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, seulement lorsque CASCADE a été enregistrer-mettre à jour les enregistrements ont été créés dans la table de téléphone aussi. Pas autrement.

Lorsque L'INVERSE était faux (C'est-à-dire que L'étudiant était le propriétaire de la relation), la table intermédiaire STUD_PHONE a été mise à jour. Lorsque l'inverse est vrai, le téléphone est propriétaire de la relation, même si un nouvel étudiant était créé, la table intermédiaire n'a pas été mise à jour.

Donc, en cas de relation de deux entités, "cascade" affecte une autre table d'entités et "inverse" affecte une table intermédiaire. De sorte que leur effet est indépendant.

76
répondu Kaushik Lele 2012-10-03 09:02:12

Informations référencées à partir de 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 mise à jour de la colonne clé étrangère).

2. cascade: En cascade, après une opération, enregistrer, mettre à jour et supprimer) est de fait, il décidera s'il faut appeler d'autres opérations (enregistrer, mettre à jour et supprimer) sur un autre entités qui avoir relation les uns avec les autres.

Conclusion: En bref, le "inverse" décide de quelle partie mettra à jour le clé étrangère, tandis que "cascade" décide quel est le suivi par opération exécuter. Les deux semblent assez similaires en relation, mais c'est totalement deux des choses différentes. Hibernate développeurs valent la peine de passer du temps à la recherche sur il, parce que l'incompréhension du concept ou abuser il apportera sérieux problème de performance ou d'intégrité des données dans leur application.

Vérifiez également ce sujet du forum: https://forum.hibernate.org/viewtopic.php?f=1&t=949041

24
répondu YoK 2017-10-11 23:47:11