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

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

一对一映射是最基本的对象之间的关系之一,严格的说来一对一有一下几种对应关系:
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 一对一双向主键关联源码

上一篇: Hibernate4 mysql 采用注解(annotation)方式配置入门例子
下一篇: spring mvc inteceptor 拦截器实现计算controller 的执行时间
 评论 ( What Do You Think )
名称
邮箱
网址
评论
验证
   
 

 


  • 微信公众号

  • 我的微信

站点声明:

1、一号门博客CMS,由Python, MySQL, Nginx, Wsgi 强力驱动

2、部分文章或者资源来源于互联网, 有时候很难判断是否侵权, 若有侵权, 请联系邮箱:summer@yihaomen.com, 同时欢迎大家注册用户,主动发布无版权争议的 文章/资源.

3、鄂ICP备14001754号-3, 鄂公网安备 42280202422812号