Hibernate – 1対1の例(XMLマッピング)
A one-to-one relationships occurs when one entity is related to exactly
one occurrence in another entity.
このチュートリアルでは、HibernateでXMLマッピングファイル(hbm)を使用して1対1のテーブル関係を操作する方法を説明します。
このチュートリアルで使用されるツールとテクノロジ:
-
Hibernate 3.6.3.Final
-
MySQL 5.1.15
-
Maven 3.0.3
-
Eclipse 3.6
プロジェクト構造
このチュートリアルの最終的なプロジェクト構造を参照してください。
プロジェクトの依存関係
ファイル:pom.xml
<project ...> <repositories> <repository> <id>JBoss repository</id> <url>http://repository.jboss.org/nexus/content/groups/public/</url> </repository> </repositories> <dependencies> <!-- MySQL database driver --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.15</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>3.6.3.Final</version> </dependency> <dependency> <groupId>javassist</groupId> <artifactId>javassist</artifactId> <version>3.12.1.GA</version> </dependency> </dependencies> </project>
1.「1対1」のテーブル関係
A ** 1対1のリレーションシップ・テーブルの設計では、STOCKテーブルにはSTOCK
DETAILテーブルのレコードが1つだけ含まれています。どちらのテーブルも主キーと同じStock
Idを持ちます。 STOCK
DETAIL表では、Stock
Idが主キーであり、STOCK表に対する外部キーです。これは、「1対1」のテーブル関係を定義する一般的な方法です。
STOCKおよびSTOCK__DETAILテーブル・スクリプトを取得するには、この「
MySQLの1対1のテーブル関係
」を参照してください。
2. Hibernateモデルクラス
上記の表を表すために、
Stock.java`と
StockDetail.java`という2つのモデルクラスを作成します。
File:Stock.java
package com.mkyong.stock; public class Stock implements java.io.Serializable { private Integer stockId; private String stockCode; private String stockName; private StockDetail stockDetail; //constructor & getter and setter methods }
ファイル:Stock Detail.java
package com.mkyong.stock; public class StockDetail implements java.io.Serializable { private Integer stockId; private Stock stock; private String compName; private String compDesc; private String remark; private Date listedDate; //constructor & getter and setter methods }
3. Hibernate XMLマッピング
今度は、2つのHibernateマッピングファイル(hbm) –
Stock.hbm.xml`と
StockDetail.hbm.xml`を作成してください。
File:Stock.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- Generated 25 April 2011 7:52:33 PM by Hibernate Tools 3.4.0.CR1 --> <hibernate-mapping> <class name="com.mkyong.stock.Stock" table="stock" catalog="mkyongdb"> <id name="stockId" type="java.lang.Integer"> <column name="STOCK__ID"/> <generator class="identity"/> </id> <property name="stockCode" type="string"> <column name="STOCK__CODE" length="10" not-null="true" unique="true"/> </property> <property name="stockName" type="string"> <column name="STOCK__NAME" length="20" not-null="true" unique="true"/> </property> <one-to-one name="stockDetail" class="com.mkyong.stock.StockDetail" cascade="save-update"></one-to-one> </class> </hibernate-mapping>
File:StockDetail.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- Generated 25 April 2011 7:52:33 PM by Hibernate Tools 3.4.0.CR1 --> <hibernate-mapping> <class name="com.mkyong.stock.StockDetail" table="stock__detail" catalog="mkyongdb"> <id name="stockId" type="java.lang.Integer"> <column name="STOCK__ID"/> <generator class="foreign"> <param name="property">stock</param> </generator> </id> <one-to-one name="stock" class="com.mkyong.stock.Stock" constrained="true"></one-to-one> <property name="compName" type="string"> <column name="COMP__NAME" length="100" not-null="true"/> </property> <property name="compDesc" type="string"> <column name="COMP__DESC" not-null="true"/> </property> <property name="remark" type="string"> <column name="REMARK" not-null="true"/> </property> <property name="listedDate" type="date"> <column name="LISTED__DATE" length="10" not-null="true"/> </property> </class> </hibernate-mapping>
-
注
+この1対1の関係の主な難点は、両方に同じ主キーが割り当てられていることです。 StockDetail.hbm.xmlでは、特殊な
外部識別子ジェネレータ** が宣言され、STOCKテーブルからプライマリキー値を取得することがわかります。 constrained = “true”の場合、Stockが存在する必要があります。
4.ハイバネート設定ファイル
あなたのHibernate設定ファイルに
Stock.hbm.xml`と
StockDetail.hbm.xml`を置きます。また、MySQL接続の詳細も入れます。 +
+ファイル:hibernate.cfg.xml
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="hibernate.connection.driver__class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/mkyongdb</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">password</property> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <property name="show__sql">true</property> <mapping resource="com/mkyong/stock/Stock.hbm.xml"/> <mapping resource="com/mkyong/stock/StockDetail.hbm.xml"/> </session-factory> </hibernate-configuration>
5.それを実行する
これを実行すると、HibernateはSTOCKテーブルに行を挿入し、STOCK__DETAILテーブルに行を挿入します。
ファイル:App.java
package com.mkyong; import java.util.Date; import org.hibernate.Session; import com.mkyong.stock.Stock; import com.mkyong.stock.StockDetail; import com.mkyong.util.HibernateUtil; public class App { public static void main(String[]args) { System.out.println("Hibernate one to one (XML mapping)"); Session session = HibernateUtil.getSessionFactory().openSession(); session.beginTransaction(); Stock stock = new Stock(); stock.setStockCode("4715"); stock.setStockName("GENM"); StockDetail stockDetail = new StockDetail(); stockDetail.setCompName("GENTING Malaysia"); stockDetail.setCompDesc("Best resort in the world"); stockDetail.setRemark("Nothing Special"); stockDetail.setListedDate(new Date()); stock.setStockDetail(stockDetail); stockDetail.setStock(stock); session.save(stock); session.getTransaction().commit(); System.out.println("Done"); } }
出力
Hibernate one to one (XML mapping) Hibernate: insert into mkyongdb.stock (STOCK__CODE, STOCK__NAME) values (?, ?) Hibernate: insert into mkyongdb.stock__detail (COMP__NAME, COMP__DESC, REMARK, LISTED__DATE, STOCK__ID) values (?, ?, ?, ?, ?) Done
-
Hibernateアノテーション** Hibernateアノテーションの1対1の場合は、次のリンクを参照してください://hibernate/hibernate-one-to-one-relationship-example-annotation/[example]
それをダウンロードする –
Hibernate -one-to-one-xml-mapping.zip
(10KB)
リファレンス
ドキュメンテーション – 1対1の関係]