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

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

1対多の関係は、1つのエンティティが別のエンティティの多くのオカレンスに関連付けられている場合に発生します。

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

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

  1. Hibernate 3.6.3。最終

  2. MySQL 5.1.15

  3. Maven 3.0.3

  4. Eclipse 3.6

プロジェクト構造

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

one to many folder

プロジェクトの依存関係

JBossリポジトリからhibernate.jarを取得すると、Mavenが関連するすべての依存関係を処理します

ファイル: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. 「一対多」の例

これはone-to-many関係テーブルの設計であり、STOCKテーブルにはSTOCK_DAILY_RECORDテーブルが多数出現します。

one to many table relationship

MySQLテーブルスクリプトを参照

DROP TABLE IF EXISTS `stock`;
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
) ENGINE=InnoDB AUTO_INCREMENT=34 DEFAULT CHARSET=utf8;


DROP TABLE IF EXISTS `exampledb`.`stock_daily_record`;
CREATE TABLE  `exampledb`.`stock_daily_record` (
  `RECORD_ID` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `PRICE_OPEN` float(6,2) DEFAULT NULL,
  `PRICE_CLOSE` float(6,2) DEFAULT NULL,
  `PRICE_CHANGE` float(6,2) DEFAULT NULL,
  `VOLUME` bigint(20) unsigned DEFAULT NULL,
  `DATE` date NOT NULL,
  `STOCK_ID` int(10) unsigned NOT NULL,
  PRIMARY KEY (`RECORD_ID`) USING BTREE,
  UNIQUE KEY `UNI_STOCK_DAILY_DATE` (`DATE`),
  KEY `FK_STOCK_TRANSACTION_STOCK_ID` (`STOCK_ID`),
  CONSTRAINT `FK_STOCK_TRANSACTION_STOCK_ID` FOREIGN KEY (`STOCK_ID`)
  REFERENCES `stock` (`STOCK_ID`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=36 DEFAULT CHARSET=utf8;

2. Hibernateモデルクラス

上記のテーブルを表すために、Stock.javaStockDailyRecord.javaの2つのモデルクラスを作成します。

ファイル: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 stockDailyRecords =
                new HashSet(0);

    //getter, setter and constructor
}

ファイル:StockDailyRecord.java

package com.example.stock;

import java.util.Date;

public class StockDailyRecord implements java.io.Serializable {

    private Integer recordId;
    private Stock stock;
    private Float priceOpen;
    private Float priceClose;
    private Float priceChange;
    private Long volume;
    private Date date;

    //getter, setter and constructor
}

3. Hibernate XMLマッピング

次に、2つのHibernateマッピングファイル(hbm)–Stock.hbm.xmlStockDailyRecord.hbm.xmlを作成します。

ファイル:Stock.hbm.xml



    
        
            
            
        
        
            
        
        
            
        
        
            
                
            
            
        
    

ファイル:StockDailyRecord.hbm.xml



    
        
            
            
        
        
            
        
        
            
        
        
            
        
        
            
        
        
            
        
        
            
        
    

4. Hibernate設定ファイル

Stock.hbm.xmlStockDailyRecord.hbm.xmlをHibernate構成ファイルに入れ、MySQL接続の詳細も入れます。

ファイル:hibernate.cfg.xml





    com.mysql.jdbc.Driver
    jdbc:mysql://localhost:3306/exampledb
    root
    password
    org.hibernate.dialect.MySQLDialect
    true
    true
    
    

5. それを実行します

実行すると、HibernateはSTOCKテーブルに行を挿入し、STOCK_DAILY_RECORDテーブルに行を挿入します。

ファイル:App.java

package com.example;

import java.util.Date;

import org.hibernate.Session;

import com.example.stock.Stock;
import com.example.stock.StockDailyRecord;
import com.example.util.HibernateUtil;

public class App {
    public static void main(String[] args) {

        System.out.println("Hibernate one to many (XML Mapping)");
    Session session = HibernateUtil.getSessionFactory().openSession();

    session.beginTransaction();

    Stock stock = new Stock();
        stock.setStockCode("7052");
        stock.setStockName("PADINI");
        session.save(stock);

        StockDailyRecord stockDailyRecords = new StockDailyRecord();
        stockDailyRecords.setPriceOpen(new Float("1.2"));
        stockDailyRecords.setPriceClose(new Float("1.1"));
        stockDailyRecords.setPriceChange(new Float("10.0"));
        stockDailyRecords.setVolume(3000000L);
        stockDailyRecords.setDate(new Date());

        stockDailyRecords.setStock(stock);
        stock.getStockDailyRecords().add(stockDailyRecords);

        session.save(stockDailyRecords);

    session.getTransaction().commit();
    System.out.println("Done");
    }
}

出力…

Hibernate one to many (XML Mapping)
Hibernate:
    insert
    into
        exampledb.stock
        (STOCK_CODE, STOCK_NAME)
    values
        (?, ?)
Hibernate:
    insert
    into
        exampledb.stock_daily_record
        (STOCK_ID, PRICE_OPEN, PRICE_CLOSE, PRICE_CHANGE, VOLUME, DATE)
    values
        (?, ?, ?, ?, ?, ?)

Hibernate Annotation
Hibernateアノテーションの1対多については、このexampleを参照してください。

ダウンロード–Hibernate-one-to-many-xml-mapping.zip(10KB)