一對一主鍵關聯映射(單向Person—->IdCard)
原理:讓兩個實體的主鍵一樣,這樣就不需要加入多餘的字段瞭。
舉例:一個人(Person)擁有一張身份證(IdCard)。
Person類的映射文件Person.hbm.xml。
[html]
<hibernate-mapping>
<class name="com.snail.hibernate.Person" table="t_person">
<id name="id">
<!– 采用foreign生成策略,foreign會取得關聯對象的標識 –>
<generator class="foreign">
<!– property隻關聯對象 –>
<param name="property">idCard</param>
</generator>
</id>
<property name="name"/>
<one-to-one name="idCard" constrained="true"/>
</class>
</hibernate-mapping>
從對象模型中看,Person類持有IdCard的引用。從配置看,<one-to-one>指示hibernate如何加載關聯對象,默認根據主鍵加載,也就是拿到關系字段值,根據對端的主鍵來加載關聯對象。Constrained=”true”表示,當前主鍵(person的主鍵)還是一個外鍵,參照瞭對端的主鍵(IdCard的主鍵),也就是會生成外鍵約束語句。
一對一主鍵關聯映射(雙向Person<—->IdCard)
原理:與上面單項相同,隻是需要兩端都需要維護。
舉例:同上。
Person的映射文件不變,和上面相同。IdCard的映射文件IdCard.hbm.xml。
[html]
<hibernate-mapping>
<class name="com.snail.hibernate.IdCard" table="t_idCard">
<id name="id">
<generator class="native"/>
</id>
<property name="cardNo"/>
<one-to-one name="person"/>
</class>
</hibernate-mapping>
在對象模型中,Person和IdCard各自都持有對方的引用,在配置方面,需要在IdCard加入<one-to-one>標簽,隻是hibernate將關聯對象Person根據主鍵加載上來。<one-to-one>不影響存儲,隻影響加載。
一對一唯一外鍵關聯映射(單向Person—->IdCard)
原理:一對一唯一外鍵關聯映射其實是多對一的特例,因此和上篇講過的原理相同。
舉例:同上。
Person對象映射文件Person.hbm.xml。
[html]
<hibernate-mapping>
<class name="com.snail.hibernate.Person" table="t_person">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<many-to-one name="idCard" unique="true"/>
</class>
</hibernate-mapping>
采用<many-to-one>標簽來映射,指定多的一端unique為true,這樣就限制瞭多的一端的多重性為一。
一對一唯一外鍵關聯映射(雙向Person<—->IdCard)
原理:同上。
舉例:同上。
Person映射文件不變,和上面相同。IdCard的映射文件IdCard.hbm.xml。
[html]
<hibernate-mapping>
<class name="com.snail.hibernate.IdCard" table="t_idCard">
<id name="id">
<generator class="native"/>
</id>
<property name="cardNo"/>
<one-to-one name="person" property-ref="idCard"/>
</class>
</hibernate-mapping>
從對象模型看,雙方都各自持有對方的引用。從配置看,一對一唯一外鍵關聯雙向采用<one-to-one>標簽映射,必須指定<one-to-one>標簽中的property-ref屬性為關系字段的名稱,它表示本類(IdCard)的主鍵將會與關聯類(Person)的此屬性(idCard)相對應。
多對多關聯映射(單向User—->Role)
原理:一般的設計中,多對多關聯映射,需要一個中間表,將兩個表中的主鍵放到中間表中做一個關聯。
舉例:一個用戶(User)對多個角色(Role),一個角色對多個用戶。
User對象的映射文件User.hbm.xml。
[html]
<hibernate-mapping package="com.snail.hibernate">
<class name="User" table="t_user">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<set name="roles" table="t_user_role">
<key column="user_id"/>
<many-to-many class="Role" column="role_id"/>
</set>
</class>
</hibernate-mapping>
多對多的關聯映射,在實體類中,跟一對多一樣,也是用集合來表示的。<set>標簽中用table屬性重命名中間表名稱,<key>標簽定義當前表的主鍵,用<many-to-many>標簽來關聯另一張表。
多對多關聯映射(雙向User<—->Role)
原理:同上。
舉例:同上。
User對象的映射文件和上面相同。Role的映射文件Role.hbm.xml。
[html]
<hibernate-mapping package="com.snail.hibernate">
<class name="Role" table="t_role">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<set name="users" table="t_user_role">
<key column="role_id"/>
<many-to-many class="User" column="user_id"/>
</set>
</class>
</hibernate-mapping
多對多雙向關系中,User和Role的映射文件相同,值得註意的是生成的中間表名稱必須一樣,生成中間表的字段必須一樣。
關聯關系到此就結束瞭,咋一看Hibernate的關聯關系一大堆,搞得人發暈,但是把這些歸納起來,並分類匯總理解就非常簡單瞭。
作者:StubbornPotatoes