上一节介绍的基于外键的一对一映射关系中,在Person表中有一个外键列idCard_id,对应的idCard表的主键id,至于基于主键的一对一映射关系,就是指Person表中抛弃了idcard_id这个外键列,而与idCard表共用一个主键,或者说是其外键为主键的表结构,这种基于主键的双向一对一映射关系应该这样配置:
新建一个IdCard实体类:
public class IdCard {
private int id;
private String code;
private Person person;
//get/set方法省略
}
新建一个Person实体类:
public class Person {
private int id;
private String name;
private int age;
private IdCard idCard;
//get/set方法省略
}
在当前包下新建IdCard类的映射文件IdCard.hbm.xml:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.wang.pojo">
<class name="IdCard" >
<id name="id">
<generator class="native"></generator>
</id>
<property name="code"></property>
<!-- 只需要添加此标签就可以 -->
<one-to-one name="person"></one-to-one>
</class>
</hibernate-mapping>
在当前包下新建Person类的映射文件Person.hbm.xml:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.wang.pojo">
<class name="Person" >
<id name="id">
<!-- foreign表示引用外键 -->
<generator class="foreign">
<!-- 引用idCard表中所对应的主键 -->
<param name="property">idCard</param>
</generator>
</id>
<property name="name"></property>
<property name="age"></property>
<!-- constrained="true" 表示设置主键约束为true -->
<one-to-one name="idCard" constrained="true" cascade="save-update"></one-to-one>
</class>
</hibernate-mapping>
将两个映射文件添加到hibernate.cfg.xml中;新建测试类,测试:1,自动生成表2:保存数据3:读取数据:
@Test
public void testCreateDB() {
Configuration cfg = new Configuration().configure();
SchemaExport se = new SchemaExport(cfg);
// 第一个参数是否生成ddl脚本 第二个参数是否执行到数据库
se.create(true, true);
}
@Test
public void testSave() {
Session session = HibernateUtil.getSession();
Transaction tx = session.beginTransaction();
// Score s=new Score(2,12,97);
// session.save(s);
IdCard id1=new IdCard();
id1.setCode("3713251882923783494");
IdCard id2=new IdCard();
id2.setCode("3713251882925378612");
Person p1=new Person();
p1.setName("李云龙");
p1.setAge(41);
p1.setIdCard(id1);
Person p2=new Person();
p2.setName("楚云飞");
p2.setAge(34);
p2.setIdCard(id2);
session.save(p1);
session.save(p2);
//session.save(p3);
tx.commit();
session.close();
}
@Test
public void testGet() {
Session session = HibernateUtil.getSession();
Transaction tx = session.beginTransaction();
Person p=(Person)session.get(Person.class, 1);
System.out.println("name="+p.getName()+"===idcard="+p.getIdCard().getCode());
IdCard id=(IdCard)session.get(IdCard.class, 1);
System.out.println("name="+id.getPerson().getName()+"==idcard="+id.getCode());
tx.commit();
session.close();
}
以上是基于主键的双向一对一映射关系,如果只需要设置单向一对一映射,假如只需要通过Person类能获取到IdCard类的信息就可以,不需要通过IdCard来获取Person中的信息,只要把Idcard类中private Perosn person;以及对应get/set方法去掉,然后将IdCard.hbm.xml中的 <one-to-one name="person"></one-to-one>标签去掉即可.其他地方不需要改变.