Hibernate4 一对一双向主键关联测试例子(xml 配置方式)
By:Roy.LiuLast updated:2014-01-06
一对一映射是最基本的对象之间的关系之一,严格的说来一对一有一下几种对应关系:
1, 一对一 单向关联(分主键,外键两种)
2, 一对一 双向关联(主键,外键两种)
3, 还可以采用中间表方式来实现,但一般不使用,先直接看看双向主键关联的测试.
准备hibernate 一对一 双向主键关联工程,复制最开始的xml 配置的工程
原始的工程参考这里:hiberante4 xml 配置, 既然是一对一关联,必然需要另外对象来隐射,也就是要多一张表:
创建stock_detail 这个表,并完成相关的 实体类定义
同样的道理,双向关联,也需要修改原来Stock.java。
实现hibernate 配置文件,并配置一对一双向关联,Stock.hbm.xml
StockDetail.hbm.xml:
测试程序编写
运行,并检查测试结果
检查数据库,记录增加成功,说明一对一关联插入数据成功,但要注意的是:这种一对一双向主键关联,是让两张的主键值一样。要使两表的主键相同,只能一张表生成主键,另一张表参考主键。这里采用了stock表生成主键,而stock_detail 使用这个主键的方式. 另外注意 StockDetail.hbm.xml 中 ID 的生成策略:
采用了class= foreign 方式。这是一对一主键关联的标志.
源代码下载:hibernate4 一对一双向主键关联源码
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
StockDetail.hbm.xml:
stock
测试程序编写
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 的生成策略:
stock
采用了class= foreign 方式。这是一对一主键关联的标志.
源代码下载:hibernate4 一对一双向主键关联源码
From:一号门

COMMENTS