Hibernate – 1対多の例(XMLマッピング)
1対多の関係は、1つのエンティティが別のエンティティの多くのオカレンスに関連付けられている場合に発生します。
このチュートリアルでは、XMLマッピングファイル(hbm)を介して、Hibernateで1対多のテーブルリレーションシップを操作する方法を示します。
このチュートリアルで使用されるツールとテクノロジー:
-
Hibernate 3.6.3。最終
-
MySQL 5.1.15
-
Maven 3.0.3
-
Eclipse 3.6
プロジェクト構造
このチュートリアルのプロジェクト構造。
プロジェクトの依存関係
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テーブルが多数出現します。
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.java
とStockDailyRecord.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 SetstockDailyRecords = 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.xml
とStockDailyRecord.hbm.xml
を作成します。
ファイル:Stock.hbm.xml
ファイル:StockDailyRecord.hbm.xml
4. Hibernate設定ファイル
Stock.hbm.xml
とStockDailyRecord.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)