Hibernate - 多対多の例(XMLマッピング)

Hibernate –多対多の例(XMLマッピング)

エンティティの各レコードが別のエンティティに多くのリンクされたレコードを持つ場合、またはその逆の場合、多対多の関係が発生します。

このチュートリアルでは、XMLマッピングファイル(hbm)を介して、Hibernateで多対多のテーブルリレーションシップを操作する方法を示します。

Note
結合テーブルに余分な列がある多対多の場合は、このtutorialを参照してください。

このチュートリアルで使用されるツールとテクノロジー:

  1. Hibernate 3.6.3。最終

  2. MySQL 5.1.15

  3. Maven 3.0.3

  4. Eclipse 3.6

プロジェクト構造

このチュートリアルのプロジェクト構造。

many to many project folder

プロジェクトの依存関係

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への外部キー参照のみで構成されます。

many to many ER diagram

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.javaCategory.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.xmlCategory.hbm.xmlを作成します。 3番目の「stock_category」テーブルは「many-to-many」タグを介した参照であることがわかります。

ファイル:Stock.hbm.xml



    
        
            
            
        
        
            
        
        
            
        
        
            
                
            
            
                
            
        
    

ファイル:Category.hbm.xml



    
        
            
            
        
        
            
        
        
            
        
        
            
                
            
            
                
            
        
    

4. Hibernate設定ファイル

ここで、Stock.hbm.xmlCategory.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)