Hibernate –多対多の例(XMLマッピング)
エンティティの各レコードが別のエンティティに多くのリンクされたレコードを持つ場合、またはその逆の場合、多対多の関係が発生します。
このチュートリアルでは、XMLマッピングファイル(hbm)を介して、Hibernateで多対多のテーブルリレーションシップを操作する方法を示します。
Note
結合テーブルに余分な列がある多対多の場合は、このtutorialを参照してください。
このチュートリアルで使用されるツールとテクノロジー:
-
Hibernate 3.6.3。最終
-
MySQL 5.1.15
-
Maven 3.0.3
-
Eclipse 3.6
プロジェクト構造
このチュートリアルのプロジェクト構造。

プロジェクトの依存関係
JBossリポジトリから最新のhibernate.jarを取得します。
ファイル: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. 「多対多」の例
これは多対多のリレーションシップテーブルデザインであり、STOCKテーブルには複数のCATEGORYがあり、CATEGORYは複数のSTOCKに属することができ、リレーションシップはSTOCK_CATEGORYと呼ばれる3番目のテーブルにリンクされます。
テーブルSTOCK_CATEGORYは、2つの主キーと、STOCKおよびCATEGORYへの外部キー参照のみで構成されます。

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. Hibernateモデルクラス
上記のテーブルを表すために、Stock.javaとCategory.javaの2つのモデルクラスを作成します。 テーブル ‘stock_category‘用に追加のクラスを作成する必要はありません。
ファイル: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 Set categories = new HashSet(0);
//getter, setter and constructor
}
ファイル: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 Set stocks = new HashSet(0);
//getter, setter and constructor
}
3. Hibernate XMLマッピング
次に、2つのHibernateマッピングファイル(hbm)–Stock.hbm.xmlとCategory.hbm.xmlを作成します。 3番目の「stock_category」テーブルは「many-to-many」タグを介した参照であることがわかります。
ファイル:Stock.hbm.xml
ファイル:Category.hbm.xml
4. Hibernate設定ファイル
ここで、Stock.hbm.xmlとCategory.hbm.xmlおよびMySQLの詳細をhibernate.cfg.xmlに配置します。
ファイル:hibernate.cfg.xml
com.mysql.jdbc.Driver jdbc:mysql://localhost:3306/exampledb root password org.hibernate.dialect.MySQLDialect true true
5. それを実行します
実行すると、HibernateはSTOCKテーブルにレコードを挿入し、CATEGORYテーブルに2つのレコードを挿入し、STOCK)CATEGORYテーブルにも2つのレコードを挿入します。
ファイル: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");
Set categories = new HashSet();
categories.add(category1);
categories.add(category2);
stock.setCategories(categories);
session.save(stock);
session.getTransaction().commit();
System.out.println("Done");
}
}
出力…結果は自明である必要があります
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
Hibernateアノテーションの多対多については、このexampleを参照してください。
ダウンロード–Hibernate-many-to-many-xml-mapping.zip(10KB)