【7.4.3】基于主键的双向一对一映射
1.公民表person 和身份证 IdCard
2.类Person 和IdCard类
public class Person {
private int id;
private String name;
private int age;
private IdCard idCard;
//get…set
}
public class IdCard{
private int id;
private String code;
private Person person;
//get…set
}
3.映射文件
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="cn.siggy.pojo"> <class name="IdCard"> <id name="id"> <generator class="native"></generator> </id> <property name="code"/> <one-to-one name="person"/> </class> </hibernate-mapping>
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="cn.siggy.pojo"> <class name="Person"> <id name="id"> <!-- foreign表示引用外键 --> <generator class="foreign"> <!-- 引用idCard属性所对应的主键 --> <param name="property">idCard</param> </generator> </id> <property name="name"/> <property name="age"/> <!-- 一对一 --> <one-to-one name="idCard" constrained="true" cascade="save-update"/> </class> </hibernate-mapping>
3.测试代码
package cn.siggy.test;
import java.sql.SQLException;
import javax.sql.rowset.serial.SerialException;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport;
import org.junit.Test;
import cn.siggy.pojo.IdCard;
import cn.siggy.pojo.Person;
import cn.siggy.util.HibernateUtil;
public class HibernateTest {
@Test
public void testCreateDB(){
Configuration cfg = new Configuration().configure();
SchemaExport se = new SchemaExport(cfg);
//第一个参数 是否生成ddl脚本 第二个参数 是否执行到数据库中
se.create(true, true);
}
@Test
public void testSave() throws HibernateException, SerialException, SQLException{
Session session = null;
Transaction tx = null;
try{
session = HibernateUtil.getSession();
tx = session.beginTransaction();
IdCard id1 = new IdCard();
id1.setCode("320123231212112");
IdCard id2 = new IdCard();
id2.setCode("110231432423432");
Person person1 = new Person();
person1.setName("贾宝玉");
person1.setAge(23);
person1.setIdCard(id1);
Person person2 = new Person();
person2.setName("林黛玉");
person2.setAge(22);
person2.setIdCard(id2);
Person person3 = new Person();
person3.setName("薛宝钗");
person3.setAge(21);
person3.setIdCard(id2);
session.save(person1);
session.save(person2);
//当保存person3出错
//session.save(person3);
tx.commit();
}catch (HibernateException e) {
if(tx!=null)
tx.rollback();
e.printStackTrace();
throw e;
}finally{
HibernateUtil.closeSession();
}
}
@Test
public void testGet(){
Session session = null;
Transaction tx = null;
try{
session = HibernateUtil.getSession();
tx = session.beginTransaction();
Person person =(Person)session.get(Person.class, 1);
System.out.println("personName:"+person.getName()+"--idCard:"+person.getIdCard().getCode());
System.out.println("============================");
IdCard idcard = (IdCard)session.get(IdCard.class, 2);
System.out.println("personName:"+idcard.getPerson().getName()+"--idCard:"+idcard.getCode());
//取数据
tx.commit();
}catch (HibernateException e) {
if(tx!=null)
tx.rollback();
e.printStackTrace();
throw e;
}finally{
HibernateUtil.closeSession();
}
}
}
4.测试结果
1.执行testSave()方法:
2.执行testGet()方法:





浙公网安备 33010602011771号