Hibernate4 一对一双向主键关联测试例子(xml 配置方式)

一对一映射是最基本的对象之间的关系之一,严格的说来一对一有一下几种对应关系:
1, 一对一 单向关联(分主键,外键两种)
2, 一对一 双向关联(主键,外键两种)
3, 还可以采用中间表方式来实现,但一般不使用,先直接看看双向主键关联的测试.

准备hibernate 一对一 双向主键关联工程,复制最开始的xml 配置的工程
原始的工程参考这里:hiberante4 xml 配置, 既然是一对一关联,必然需要另外对象来隐射,也就是要多一张表:
程序代码 程序代码

Drop TABLE IF EXISTS `stock_detail`;
Create TABLE `stock_detail` (
  `STOCK_ID` int(11) NOT NULL DEFAULT '0',
  `COMP_NAME` varchar(100) DEFAULT NULL,
  `COMP_DESC` varchar(255) DEFAULT NULL,
  `REMARK` varchar(255) DEFAULT NULL,
  `LISTED_DATE` date DEFAULT NULL,
  PRIMARY KEY (`STOCK_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


创建stock_detail 这个表,并完成相关的 实体类定义
程序代码 程序代码

public class StockDetail {
    
    private Integer stockId;
    private Stock stock; // 因为是双向关联.
    private String compName;
    private String compDesc;
    private String remark;
    private Date listedDate;
        略去 getter,setter...
}


同样的道理,双向关联,也需要修改原来Stock.java。
程序代码 程序代码

        private Integer stockId;
    private String stockCode;
    private String stockName;
    private StockDetail stockDetail; // 增加属性,实现双向关联


实现hibernate 配置文件,并配置一对一双向关联,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">

<hibernate-mapping>
    <class name="com.yihaomen.hibernate.domain.Stock" table="stock">
        <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.yihaomen.hibernate.domain.StockDetail"
            cascade="save-update"></one-to-one>
    </class>
</hibernate-mapping>



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">

<hibernate-mapping>
    <class name="com.yihaomen.hibernate.domain.StockDetail" table="stock_detail">
       <id name="stockId" type="java.lang.Integer">
            <column name="STOCK_ID" />
            <generator class="foreign">
                <param name="property">stock</param>
            </generator>
        </id>
        
        <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>
        <one-to-one name="stock" class="com.yihaomen.hibernate.domain.Stock"
            constrained="true"></one-to-one>
    </class>
</hibernate-mapping>


测试程序编写
程序代码 程序代码

package com.yihaomen.hibernate4.test;

import java.util.Date;

import org.hibernate.Session;

import com.yihaomen.hibernate.domain.Stock;
import com.yihaomen.hibernate.domain.StockDetail;
import com.yihaomen.hibernate.util.HibernateUtil;

public class AppTest
{  
     public static void main( String[] args )
        {
         System.out.println("Hibernate one to one (XML mapping) test");
            Session session = HibernateUtil.getSessionFactory().openSession();    
            session.beginTransaction();    
            Stock stock = new Stock();    
            stock.setStockCode("471511");
            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");
        }

}



运行,并检查测试结果
程序代码 程序代码

INFO: HHH000397: Using ASTQueryTranslatorFactory
Hibernate: insert into stock (STOCK_CODE, STOCK_NAME) values (?, ?)
Hibernate: insert into stock_detail (COMP_NAME, COMP_DESC, REMARK, LISTED_DATE, STOCK_ID) values (?, ?, ?, ?, ?)
Done


检查数据库,记录增加成功,说明一对一关联插入数据成功,但要注意的是:这种一对一双向主键关联,是让两张的主键值一样。要使两表的主键相同,只能一张表生成主键,另一张表参考主键。这里采用了stock表生成主键,而stock_detail 使用这个主键的方式. 另外注意 StockDetail.hbm.xml 中 ID 的生成策略:
程序代码 程序代码

<column name="STOCK_ID" />
            <generator class="foreign">
                <param name="property">stock</param>
            </generator>

采用了class= foreign 方式。这是一对一主键关联的标志.

源代码下载:下载文件 hibernate4 一对一双向主键关联源码


除非申明,文章均为一号门原创,转载请注明本文地址,谢谢!
文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags: hibernate
相关日志:
评论: 0 | 引用: 0 | 查看次数: -
发表评论
昵 称:
密 码: 游客发言不需要密码.
内 容:
验证码: 验证码
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.