1:Person类

public class Person {

private int id;
private String name;
private IdCard idCard;
public IdCard getIdCard() {
return idCard;
} public void setIdCard(IdCard idCard) {
this.idCard = idCard;
} public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
}}

IdCard类
public class IdCard {

private int id;
private String cardNo;
private Person person;
public Person getPerson() {
return person;
} public void setPerson(Person person) {
this.person = person;
} public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getCardNo() {
return cardNo;
} public void setCardNo(String cardNo) {
this.cardNo = cardNo;
}}
2:配置文件
Person类的配置文件
<hibernate-mapping >
<class name="com.bjsxt.hibernate.Person" table="t_person">
<id name="id">
<generator class="native"></generator>
</id>
<property name="name"></property>
<many-to-one name="idCard" unique="true"/>
</class>
</hibernate-mapping>
IdCard类的配置文件
<hibernate-mapping >
<class name="com.bjsxt.hibernate.IdCard" table="t_idcard">
<id name="id">
<generator class="native"/>
</id>
<property name="cardNo"></property>
<one-to-one name="person" property-ref="idCard" cascade="all"/>
</class>
</hibernate-mapping>
3:测试程序

public void testSave1(){
Session session = null;
try{
session = HibernateUtils.getSession();
session.beginTransaction();

IdCard idCard = new IdCard();
idCard.setCardNo("88888888888888");

Person person = new Person();
person.setIdCard(idCard);
person.setName("aaa");

//不能成功保存,因为idCard是Transient状态
session.save(person);

session.getTransaction().commit();

}catch(Exception e){
e.printStackTrace();
session.getTransaction().rollback();
}finally{
HibernateUtils.closeSession(session);
}
}
//首先保存IdCard对象,然后保存Person对象
public void testSave2(){
Session session = null;
try{
session = HibernateUtils.getSession();
session.beginTransaction();

IdCard idCard = new IdCard();
idCard.setCardNo("88888888888888");
session.save(idCard);

Person person = new Person();
person.setIdCard(idCard);
person.setName("张波");

session.save(person);
session.getTransaction().commit();

}catch(Exception e){
e.printStackTrace();
session.getTransaction().rollback();
}finally{
HibernateUtils.closeSession(session);
}
}
//首先加载Person对象,然后加载IdCard对象
public void testLoad1(){
Session session = null;
try{
session = HibernateUtils.getSession();
session.beginTransaction();

Person person = (Person)session.load(Person.class,5);
System.out.println(person.getName());
System.out.println(person.getIdCard().getCardNo());

session.getTransaction().commit();

}catch(Exception e){
e.printStackTrace();
session.getTransaction().rollback();
}finally{
HibernateUtils.closeSession(session);
}
}
//首先加载IdCard对象,然后加载Person对象
public void testLoad2(){
Session session = null;
try{
session = HibernateUtils.getSession();
session.beginTransaction();

IdCard idCard = (IdCard)session.load(IdCard.class,2);
System.out.println("idcard.cardNo="+idCard.getCardNo());
System.out.println("idcard.person.name="+idCard.getPerson().getName());

session.getTransaction().commit();

}catch(Exception e){
e.printStackTrace();
session.getTransaction().rollback();
}finally{
HibernateUtils.closeSession(session);
}
}4:总结
hibernate一对一唯一外键关联映射(双向关联Person<----->IdCard)
一对一唯一外键关联双向,需要在另一端(idcard),添加<one-to-one>标签,
指示hibernate如何加载其关联对象,默认根据主键加载person,外键关联
映射中,因为两个实体采用的是person的外键维护的关系,所以不能指定主键加载
person,而要根据person的外键加载,所以采用如下映射方式:
<one-to-one name="person" property-ref="idCard"/>