Hibernate - Exemple plusieurs-à-plusieurs (mappage XML)
Les relations plusieurs-à-plusieurs se produisent lorsque chaque enregistrement d'une entité peut avoir plusieurs enregistrements liés dans une autre entité et vice-versa.
Dans ce didacticiel, nous vous montrons comment travailler avec une relation de table plusieurs à plusieurs dans Hibernate, via un fichier de mappage XML (hbm).
Note
Pour plusieurs à plusieurs avec des colonnes supplémentaires dans la table de jointure, veuillez vous référer à cetutorial.
Outils et technologies utilisés dans ces didacticiels:
-
Hibernate 3.6.3.Final
-
MySQL 5.1.15
-
Maven 3.0.3
-
Eclipse 3.6
Structure du projet
Structure du projet de ce tutoriel.
Dépendance du projet
Obtenez les derniershibernate.jar du référentiel JBoss.
Fichier: pom.xml
JBoss repository http://repository.jboss.org/nexus/content/groups/public/ mysql mysql-connector-java 5.1.15 org.hibernate hibernate-core 3.6.3.Final javassist javassist 3.12.1.GA
1. Exemple «plusieurs à plusieurs»
Il s'agit d'une conception de table de relations plusieurs-à-plusieurs, une table STOCK a plusieurs CATÉGORIES et CATEGORY peut appartenir à plusieurs STOCK, la relation est liée à une troisième table appelée STOCK_CATEGORY.
La table STOCK_CATEGORY se compose uniquement de deux clés primaires, ainsi que d'une référence de clé étrangère vers STOCK et CATEGORY.
Scripts de table MySQL
CREATE TABLE `stock` ( `STOCK_ID` int(10) unsigned NOT NULL AUTO_INCREMENT, `STOCK_CODE` varchar(10) NOT NULL, `STOCK_NAME` varchar(20) NOT NULL, PRIMARY KEY (`STOCK_ID`) USING BTREE, UNIQUE KEY `UNI_STOCK_NAME` (`STOCK_NAME`), UNIQUE KEY `UNI_STOCK_ID` (`STOCK_CODE`) USING BTREE ) CREATE TABLE `category` ( `CATEGORY_ID` int(10) unsigned NOT NULL AUTO_INCREMENT, `NAME` varchar(10) NOT NULL, `DESC` varchar(255) NOT NULL, PRIMARY KEY (`CATEGORY_ID`) USING BTREE ) CREATE TABLE `stock_category` ( `STOCK_ID` int(10) unsigned NOT NULL, `CATEGORY_ID` int(10) unsigned NOT NULL, PRIMARY KEY (`STOCK_ID`,`CATEGORY_ID`), CONSTRAINT `FK_CATEGORY_ID` FOREIGN KEY (`CATEGORY_ID`) REFERENCES `category` (`CATEGORY_ID`), CONSTRAINT `FK_STOCK_ID` FOREIGN KEY (`STOCK_ID`) REFERENCES `stock` (`STOCK_ID`) )
2. Classe de modèle Hibernate
Créez deux classes de modèle -Stock.java
etCategory.java
, pour représenter les tables ci-dessus. Pas besoin de créer une classe supplémentaire pour la table «stock_category».
Fichier: Stock.java
package com.example.stock; import java.util.HashSet; import java.util.Set; public class Stock implements java.io.Serializable { private Integer stockId; private String stockCode; private String stockName; private Setcategories = new HashSet (0); //getter, setter and constructor }
Fichier: Category.java
package com.example.stock; import java.util.HashSet; import java.util.Set; public class Category implements java.io.Serializable { private Integer categoryId; private String name; private String desc; private Setstocks = new HashSet (0); //getter, setter and constructor }
3. Hibernate XML Mapping
Maintenant, créez deux fichiers de mappage Hibernate (hbm) -Stock.hbm.xml
etCategory.hbm.xml
. Vous remarquerez que la troisième table «stock_category» est une référence via la balise «many-to-many».
Fichier: Stock.hbm.xml
Fichier: Category.hbm.xml
4. Hibernate Configuration File
Maintenant, metStock.hbm.xml
etCategory.hbm.xml
et les détails MySQL danshibernate.cfg.xml
.
Fichier: hibernate.cfg.xml
com.mysql.jdbc.Driver jdbc:mysql://localhost:3306/exampledb root password org.hibernate.dialect.MySQLDialect true true
5. Exécuter
Exécutez-le, Hibernate insérera un enregistrement dans la table STOCK, deux enregistrements dans la table CATEGORY et également deux enregistrements dans la table STOCK) CATEGORY.
Fichier: App.java
package com.example; import java.util.HashSet; import java.util.Set; import org.hibernate.Session; import com.example.stock.Category; import com.example.stock.Stock; import com.example.util.HibernateUtil; public class App { public static void main(String[] args) { System.out.println("Hibernate many to many (XML Mapping)"); Session session = HibernateUtil.getSessionFactory().openSession(); session.beginTransaction(); Stock stock = new Stock(); stock.setStockCode("7052"); stock.setStockName("PADINI"); Category category1 = new Category("CONSUMER", "CONSUMER COMPANY"); Category category2 = new Category("INVESTMENT", "INVESTMENT COMPANY"); Setcategories = new HashSet (); categories.add(category1); categories.add(category2); stock.setCategories(categories); session.save(stock); session.getTransaction().commit(); System.out.println("Done"); } }
Extrant… le résultat doit être explicite
Hibernate many to many (XML Mapping) Hibernate: insert into exampledb.stock (STOCK_CODE, STOCK_NAME) values (?, ?) Hibernate: insert into exampledb.category (NAME, `DESC`) values (?, ?) Hibernate: insert into exampledb.category (NAME, `DESC`) values (?, ?) Hibernate: insert into stock_category (STOCK_ID, CATEGORY_ID) values (?, ?) Hibernate: insert into stock_category (STOCK_ID, CATEGORY_ID) values (?, ?) Done
Hibernate Annotation
Pour l'annotation plusieurs-à-plusieurs dans Hibernate, veuillez vous référer à ceexample.
Téléchargez-le -Hibernate-many-to-many-xml-mapping.zip (10 Ko)