一对一 ,例如"人" 对 "身份证"的对应关系
第一种情况: 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类的主键.
这种情况有点像 多对一 .
关系如下图:

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


一对一关联映射
本文介绍了一对一关联映射在Hibernate中的实现方式,包括IdCard类的ID作为主键和外键的情况,以及IdCard类的ID仅作为主键,通过额外属性person_id作为外键指向Person类主键的情形。
3224

被折叠的 条评论
为什么被折叠?



