A one-to-one relationships occurs when one entity is related to exactly
one occurrence in another entity.

このチュートリアルでは、HibernateでXMLマッピングファイル(hbm)を使用して1対1のテーブル関係を操作する方法を説明します。

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

  1. Hibernate 3.6.3.Final

  2. MySQL 5.1.15

  3. Maven 3.0.3

  4. Eclipse 3.6

プロジェクト構造

このチュートリアルの最終的なプロジェクト構造を参照してください。


1対1プロジェクト構造、title = "1対1関係プロジェクト構造"、幅= 505、高さ= 482

プロジェクトの依存関係

ファイル: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」のテーブル関係を定義する一般的な方法です。


1対1の関係、title = "1対1の関係"、width = 484、height = 160

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)