一對一關聯
根據各種教科書的例子,一對一關聯可通過兩種方式實現,通過主鍵關聯和通過外鍵關聯,這裏我只介紹一下通過外鍵關聯。
在做一個例子,我在上面的程序中有一個User表,這裏我在做一個IDCARD表,表裏的內容設置了user的一些具體信息,他們是一對一的關係。
IDCARD表的SQL:
CREATE TABLE `idcard` (
`crd_id` int(11) NOT NULL auto_increment,
`crd_no` char(11) NOT NULL default 0,
`crd_eml` char(20) default NULL,
`usr_id` int(11)NOT NULL default 0,
PRIMARY KEY (`crd_id`)
) ENGINE=InnoDB DEFAULT CHARSET=UTF8;
IdCard類爲:
public class IdCard {
private int id;
private String cardNo;
private String email;
private UserInfo user;
這裏的一對一關聯關係可以看成是一對多的一個特殊形式,可能也能猜到,就是在多的一端設置其外鍵唯一就可以了,即在節點<many-to-one>裏面價格屬性,unique="true"
IdCard映射文件爲:
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-mapping
PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="xiaojin.hibernate.entity.Message" table="MESSAGE">
<id name="msgId" type="int" column="msg_id">
<generator class="native"/>
</id>
<property name="ttl" column="msg_ttl" type="string" not-null="true"/>
<property name="desc" column="msg_desc" type="string" not-null="true"/>
<property name="date" column="msg_date" type="string" />
<many-to-one name="user" class="xiaojin.hibernate.entity.UserInfo" column="usr_id" cascade="none"></many-to-one>
</class>
</hibernate-mapping>
在一的一段的映射文件裏也就是User裏面再上一個<one-to-one>節點:
<one-to-one name="idCard" class="xiaojin.hibernate.entity.IdCard" cascade="all" property-ref="user" />
property-ref="user" 指定關聯對象的屬性名。
測試方法:
public static void saveUserAndIdCard(){
UserInfo user= new UserInfo();
user.setName("xiaojin1");
user.setPassword("xiaojin");
IdCard idCard = new IdCard();
idCard.setCardNo("12121212");
idCard.setEmail("email");
idCard.setUser(user);
user.setIdCard(idCard);
save(user);
System.out.println("Save over ");
}