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

       

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

 

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

 

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

9 映射-- 一对一(两种)(人与身份)_第1张图片

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类的主键.

 

这种情况有点像 多对一  .

 

关系如下图:

 

9 映射-- 一对一(两种)(人与身份)_第2张图片

 

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

 

9 映射-- 一对一(两种)(人与身份)_第3张图片

 

9 映射-- 一对一(两种)(人与身份)_第4张图片

你可能感兴趣的:(DAO,数据结构,sql,Hibernate,xml)