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"/>