Hibernate – 1対1の例(XMLマッピング)
1対1の関係は、1つのエンティティが別のエンティティの1つのオカレンスにのみ関連付けられている場合に発生します。
このチュートリアルでは、XMLマッピングファイル(hbm)を介して、Hibernateで1対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. 「1対1」のテーブルリレーションシップ
one-to-one関係テーブルの設計であるSTOCKテーブルには、STOCK_DETAILテーブルに1つのレコードが含まれています。 両方のテーブルには、プライマリキーとして同じStock_Idがあります。 STOCK_DETAILテーブルでは、Stock_Idはプライマリキーであり、STOCKテーブルへの外部キーでもあります。 これは、「1対1」のテーブルリレーションシップを定義する一般的な方法です。

STOCKおよびSTOCK_DETAILテーブルスクリプトを取得するには、次の「http://www.example.com/mysql/how-to-define-one-to-one-relationship-in-mysql/[1対1のテーブル関係MySQL]」の記事。
2. Hibernateモデルクラス
上記のテーブルを表すために、Stock.javaとStockDetail.javaの2つのモデルクラスを作成します。
ファイル:Stock.java
package com.example.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
}
ファイル:StockDetail.java
package com.example.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を作成します。
ファイル:Stock.hbm.xml
ファイル:StockDetail.hbm.xml
stock
Note
このone-to-one関係の主な問題は、両方に同じ主キーが割り当てられていることを確認することです。 StockDetail.hbm.xmlでは、特別なforeign identifier generatorが宣言されており、STOCKテーブルから主キー値を取得することがわかります。 constrained =” true”の場合、ストックが存在する必要があります。
4. Hibernate設定ファイル
Stock.hbm.xmlとStockDetail.hbm.xmlをHibernate構成ファイルに入れ、MySQL接続の詳細も入れます。
_
ファイル:hibernate.cfg.xml_
com.mysql.jdbc.Driver jdbc:mysql://localhost:3306/exampledb root password org.hibernate.dialect.MySQLDialect true
5. それを実行します
実行すると、HibernateはSTOCKテーブルに行を挿入し、STOCK_DETAILテーブルに行を挿入します。
ファイル:App.java
package com.example;
import java.util.Date;
import org.hibernate.Session;
import com.example.stock.Stock;
import com.example.stock.StockDetail;
import com.example.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 exampledb.stock (STOCK_CODE, STOCK_NAME) values (?, ?) Hibernate: insert into exampledb.stock_detail (COMP_NAME, COMP_DESC, REMARK, LISTED_DATE, STOCK_ID) values (?, ?, ?, ?, ?) Done
Hibernate Annotation
Hibernateアノテーションの1対1については、このexampleを参照してください。
ダウンロード–Hibernate-one-to-one-xml-mapping.zip(10KB)