`

9 映射-- 一对一(两种)(人与身份)

阅读更多

       

一对一 ,例如"人" 对 "身份证"的对应关系

 

第一种情况: IdCard类的ID 既是主键又是外键

 

关系请看下图,  (图中的配置, 写反了 ,不要参考,  正确的配置请看下面的代码)

Person类:

package dao.po;

/**
 * @author zl 人类
 * 
 */
public class Person
{
	private int		id;	//ID 

	private String	name;	//姓名

	private IdCard	idCard;	//身份证(对象)
}

 

IdCard类:

package dao.po;

/**
 * @author zl 身份主类
 * 
 */
public class IdCard
{
	private int		id;		//ID

	private String	address;	//地址

	private Person	person;	//身份证的主人
}

 

两个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 
	package="dao.po">

	<class name="Person">		
		<id name="id">
			<generator class="native"/>
		</id>		
		<property name="name" not-null="true" length="255" column="`name`"/>
		
		<!-- 这里做一对一映射    -->
		<!-- 没什么好说的,就是一 one-to-one -->		
		<one-to-one name="idCard" ></one-to-one>
	</class>
	
</hibernate-mapping>

 

<?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 
	package="dao.po">

	<class name="IdCard" table="id_card">		
		<id name="id">
			<!-- 注意:  -->
			<!-- 本类的id 既是主键,又是外键  -->
			<!-- IdCard对象的是从对象, Person是主对象, 先有主,后有从.  -->			
			<generator class="foreign">
				<!-- 此处的person是IdCard类的一个属性 -->
				<param name="property">person</param>
			</generator>
			
		</id>		
		<property name="address" not-null="true" length="255" column="`address`"/>
		
		<!-- 此处的person是IdCard类的一个属性 -->
		<!-- constrained="true" 对生成的数据表产生约束,id_card表的id既是主键,又是外键 -->	
		<!-- constrained="false" 表结构上没有约束, 取何值对对象关系没影响,只是对表结构有影响-->
		<one-to-one name="person" constrained="true"/>
	</class>
	
</hibernate-mapping>

 

保存与查询:

package dao;

import org.hibernate.Hibernate;
import org.hibernate.Session;
import org.hibernate.Transaction;

import dao.po.IdCard;
import dao.po.Person;

public class One2One
{

	/**
	 * @param args
	 */
	public static void main(final String[] args)
	{
		add();
		final IdCard c1 = query(5);
		System.out.println(c1.getPerson().getName());
	}

	/**
	 * 保存
	 */
	public static void add()
	{
		final Person p1 = new Person();
		p1.setName("小明");

		final IdCard c1 = new IdCard();
		c1.setAddress("北京市海淀区上地");

		p1.setIdCard(c1); //建立关联(不能少)
		c1.setPerson(p1); //建立关联(不能少)

		Session session = null;
		try
		{
			session = HibernateUtil.getSeesion();
			final Transaction tx = session.beginTransaction();
			//session.save(p1); //
			session.save(c1); //身份证是从对象依赖于主对象, "身份证"依赖于"人", 
			//保存 c1 , 也会自动保存 他依赖的p1,前题是c1 与p1要关联.
			tx.commit();

			//SQL 如下:
			//Hibernate: insert into Person (`name`) values (?)
			//Hibernate: insert into id_card (`address`, id) values (?, ?)
			//虽然只执行了session.save(c1) , 但有两个insert

		}
		finally
		{
			if (session != null)
			{
				session.close();
			}
		}
	}

	/**
	 * 查询 身份证,
	 * 
	 * @param id
	 * @return
	 */
	public static IdCard query(final int id)
	{
		Session session = null;
		try
		{
			session = HibernateUtil.getSeesion();
			final IdCard c1 = (IdCard) session.get(IdCard.class, id);
			Hibernate.initialize(c1.getPerson());
			return c1;
			//SQL 如下:
			//Hibernate: select idcard0_.id as id3_0_, idcard0_.`address` as address2_3_0_ from id_card idcard0_ where idcard0_.id=?
			//Hibernate: select person0_.id as id2_1_, person0_.`name` as name2_2_1_, idcard1_.id as id3_0_, idcard1_.`address` as address2_3_0_ from Person person0_ left outer join id_card idcard1_ on person0_.id=idcard1_.id where person0_.id=?
			//注意person表又连了id-card表
		}
		finally
		{
			if (session != null)
			{
				session.close();
			}
		}
	}
}

 

 

 

 

 

---------------------------------------------------------------------------------------------------------------------------------------------------

第二种情况: IdCard类的ID 只是主键, IdCard类多一属性 person_id做 外键,指向Person类的主键.

 

这种情况有点像 多对一  .

 

关系如下图:

 

 

两个配置文件 内容如下,  只抓了图, 没写代码,  很简单的,不用写了,  看看图就行了 .   (图中的配置是正确的)

 

 

  • 大小: 41.5 KB
  • 大小: 43.3 KB
  • 大小: 41.7 KB
  • 大小: 69.4 KB
分享到:
评论
3 楼 msi110 2010-01-20  
楼主对一对一的延迟加载有研究吗?
2 楼 fisherhe 2009-10-12  
一直对几个hibernate的关联关系比较晕,
你的图解很详细,看起来很久豁然开朗了。
1 楼 keer2345 2009-04-28  
谢谢, 只是不大明白,如果在实际应用中如果有一对一的关系的话,一起放在一个表里面不就可以了吗

相关推荐

    网络游戏-一种社交网络账号映射模型训练方法及映射方法和系统.zip

    9. **PDF文件**:“一种社交网络账号映射模型训练方法及映射方法和系统.pdf”很可能是详细的技术文档,涵盖了模型的设计原理、实现步骤、实验结果和可能遇到的问题及解决方案。 以上是对该压缩包文件内容的初步解析...

    双线性映射需要的库文件

    双线性映射是一种特殊的映射,它将两个特定群的元素映射到一个中间群,同时保持一些特定的性质,比如双线性性。在PBC库中,可以找到实现不同域参数下的双线性配对函数,例如Weierstrass曲线上的 Tate配对或Ate配对。...

    双线性映射的概念及应用

    而在数字签名领域,双线性映射的利用,可以生成一种不可伪造的电子签名,这对于确保消息的完整性和验证发送者的身份至关重要。 综上所述,双线性映射的概念不但在数学理论上具有深远的意义,其在实际应用中的作用也...

    一种基于身份的认证加密新方案

    本文介绍的一种新的基于身份的认证加密方案结合了传统对称加密的优势与基于身份的公钥加密的特点,以提高加密/解密的效率并降低通信成本。该方案的安全性建立在双线性Diffie-Hellman计算问题的难度以及单向哈希函数...

    研究论文-基于人体头肩部形状的身份识别

    文章中提到的图像二值化处理公式是一个基本的二值化处理算法,它通过设定一个阈值T,将图像像素点的灰度值与背景图像灰度值的差分进行比较,根据结果将像素点转换为黑白两种状态。这种方法对于图像的进一步处理(如...

    一种基于双线性配对的天地一体化网络安全身份认证方案.pdf

    因此,提出一种适用于天地一体化网络的身份认证方案显得尤为迫切。 赵国锋等人提出的这一方案,通过引入双线性配对技术,实现了无需第三方参与的双向认证。这意味着网络中的任意两个实体在进行通信前,都可以互相...

    行业分类-设备装置-基于步态轨迹曲线特征的人体身份识别.zip

    在IT行业中,步态识别是一种生物特征识别技术,它利用人体行走时的步态特征来辨别个体身份。这种技术在安全监控、智能家居、医疗健康等多个领域有着广泛的应用潜力。"行业分类-设备装置-基于步态轨迹曲线特征的人体...

    模糊身份基加密(Fuzzy IBE)1

    模糊身份基加密(Fuzzy IBE)是一种加密技术,它扩展了传统的身份基加密(IBE)概念,允许一定程度的错误容忍或模糊性。在传统的IBE系统中,加密是基于接收者的精确身份,而在模糊IBE中,加密可以针对一组近似或模糊...

    Serv-U组建个人,_——完全图解教程:FTP架设、端口映射、动态域名申请_选项

    FTP的主要用途是在两个主机之间传输文件,其中一个通常作为服务器,另一个作为客户端。通过FTP,用户可以上传文件到服务器或将文件从服务器下载到本地计算机。 FTP协议工作于TCP/IP协议之上,采用客户机/服务器模式...

    论文研究-基于IRBAC2000的角色映射冲突检测方法研究 .pdf

    文章提出了一套检测算法来应对这些冲突,确保角色映射的安全性,具体包括两种主要类型的冲突:角色冲突和权限冲突。 角色冲突是指外域用户的角色在本域中可能存在同名但权限不同的情况,这可能导致用户在不自知的...

    论文研究-基于身份的指定确认者签名.pdf

    基于身份的指定确认者签名是一种数字签名技术,它依赖于椭圆曲线上的双线性对来构造签名算法。在这一方案中,签名的验证不仅仅依赖于公钥和签名本身,还需要一个指定的确认者(通常为第三方)参与验证过程。这种签名...

    putty精彩教程 端口 映射 tunnels 教程

    SSH隧道是一种利用SSH协议创建的安全通道,它可以保护数据在两端之间的传输不受拦截。通过在PuTTY中配置SSH隧道,可以实现以下几种常见的应用场景: ##### 1. **创建直接SSH隧道** - 目标:允许本地计算机通过SSH...

Global site tag (gtag.js) - Google Analytics