2010-12-14 5 views
3

Quelqu'un peut-il expliquer l'utilisation de l'inverse dans le fichier de mappage XML, je suis en train de lire le tutoriel mais ne parvient pas à comprendre son utilisation dans le fichier de mappage ??Hibernate 'Inverse' dans le fichier de mappage

Merci

Répondre

7

Inverse décide simplement quelle entité dans une relation est responsable de la mise à jour de la base de données pour refléter l'association.

Supposons une association un à plusieurs bidirectionnelle. Il existe deux classes dans le code A et B, A contient un ensemble de B, B maintient une référence à A. Au niveau de la base de données, il n'y a qu'une clé étrangère à mettre à jour, la table pour B contient une colonne à clé primaire Dans ce cas, supposons que nous plaçons l'inverse = true du côté de l'ensemble. Cela implique que l'ajout d'une entité à l'ensemble n'entraînera pas la mise à jour de la clé étrangère. Parce que la possibilité de mettre à jour la clé étrangère repose sur B. Ainsi, l'ajout d'un objet B à l'ensemble que A conserve n'est pas suffisant pour mettre à jour la colonne de clé étrangère. objectA.addToSetOfB (objectB) n'affectera pas la clé étrangère.

Seulement lorsque B est référencé A, la clé étrangère dans la table de B sera mise à jour. Donc, objectB.setA (objectA) va sûrement mettre à jour la clé étrangère et mettre en place la relation.

Je pense que le même concept portera également sur les relations plusieurs à plusieurs.

1

Dans de nombreux à plusieurs rapports, vous suivez la direction de votre rejoindre.

Ayons un exemple:

  • étudiants (IdStudent, StudentName)

  • Cours (IdCourse, courseName)

Un étudiant peut suivre un ou plusieurs cours, donc nous aurons une table commune entre Student et Course, nommée StudentCourse (IdStudent, IdCourse). L'attribut inverse doit être positionné sur la moitié Course, car il indique à Hibernate (qui ne connaît pas grand-chose de la table StudentCourse) pour construire correctement ses requêtes.

Si vous mettez l'attribut inverse sur true sur la moitié Student, Hibernate pense que la table conjointe est CourseStudent (IdCourse, IdStudent) !!

C'est le même comportement pour les relations one-to-many.

3

Si une collection est marquée comme "inverse", alors Hibernate n'exécutera aucun SQL pour maintenir la collection dans la base de données. Par exemple, les collections un-à-plusieurs sont souvent (dans mon expérience, pratiquement toujours) marquées comme inverses: les «nombreuses» entités (membres de la collection) ont une colonne avec l'ID du parent (mappée en tant que -to-one property), et en créant simplement une de ces entités signifie qu'il sera implicitement inclus dans la collection, donc pas besoin de les mettre à jour explicitement. Si vous utilisez une collection many-to-many (qui se produit généralement par paires), l'une des collections doit être marquée comme "inverse", sinon Hibernate va essayer de créer deux fois les entrées de la table de jointure représentant la collection .

0

inverse dit à hibernate de gérer les clés étrangères afin de ne pas avoir de problème avec les entités de référence. Si vous définissez une relation bidirectionnelle, vous pouvez naviguer des deux côtés de l'objet. L'indicateur inverse vous permet de définir correctement la relation (pour éviter les violations de contraintes). hibernate ne sait pas comment mettre en caisse les instructions inser si vous ne définissez pas l'indicateur inverse. Faire un côté d'une collection dit à hiberner que c'est un miroir de l'autre côté. Il est toujours nécessaire pour hibernate de transformer java en code SQL.

Les règles sont simples:

Règles pour les relations bidirectionnelles:

  • Toutes les associations bidirectionnelles besoin d'un côté comme inverse.
  • one-to-many => association, il doit être le côté beaucoup
  • many-to-many => association, vous pouvez sélectionner chaque côté.
Questions connexes