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

来源:互联网 发布:ubuntu安装mysql命令 编辑:程序博客网 时间:2024/04/30 02:27

       

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

 

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

 

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

Person类:

package dao.po;/** * @author zl 人类 *  */public class Person{private intid;//ID private Stringname;//姓名private IdCardidCard;//身份证(对象)}

 

IdCard类:

package dao.po;/** * @author zl 身份主类 *  */public class IdCard{private intid;//IDprivate Stringaddress;//地址private Personperson;//身份证的主人}

 

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

 

这种情况有点像 多对一  .

 

关系如下图:

 

 

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

 

 

原创粉丝点击