在上一篇【SSH】——Hibernate(3)實體映射中,已經提到了,ORM功能的實現,主要文件有映射類(*.java),映射文件(*.hbm.xml)和配置文件(*.property/.cfg.xml)。接下來通過三個文件,對映射類的實現進行分析。
關聯映射主要分爲兩大類:單向關聯和雙向關聯。今天主要說一下單向關聯。
一)一對一關聯映射
兩個對象之間一對的關係,例如:Person(人)-IdCard(身份證)
有兩種策略可以實現一對一的關聯映射:
*主鍵關聯:即讓兩個對象具有相同的主鍵值,以表明它們之間的一一對應的關係;數據庫表不會有額外的字段來維護它們之間的關係,僅通過表的主鍵來關聯。如下圖:
Hbm.xml配置文件:
<hibernate-mapping>
<class name="com.example.hibernate.IdCard" table="t_idCard">
<id name="id">
<generator class="native"/>
</id>
<property name="cardNo"/>
</class>
</hibernate-mapping>
<hibernate-mapping>
<class name="com.example.hibernate.User" table="t_person">
<id name="id">
<!-- 採用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>
Hbm.xml文件配置:
<hibernate-mapping>
<class name="com.example.hibernate.Person" table="t_person">
<id name="id">
<generator class="native"/>
</id>
<!-- property指關聯對象 -->
<property name="name"/>
<!-- 默認參考idCard的主鍵-->
<many-to-one name="idCard" unique="true"/>
</class>
</hibernate-mapping>
<hibernate-mapping>
<class name="com.example.hibernate.IdCard" table="t_idCard">
<id name="id">
<generator class="native"/>
</id>
<property name="cardNo"/>
</class>
</hibernate-mapping>
二)多對一關聯映射
用戶和組是多對一的關係。一個組有多個用戶,一個用戶只屬於一個組。有了ER圖知識的積累,我們知道多對一的關聯映射策略一定是在多的一端加入一個外鍵,指向一的一端。
Hbm.xml文件配置:
<hibernate-mapping>
<classname="com.bjpowernode.hibernate.User"table="t_user">
<idname="id">
<generatorclass="native"/>
</id>
<propertyname="name"/>
<many-to-one name="group"column="groupid"cascade="save-update"/>
</class>
</hibernate-mapping>
三)一對多關聯映射(***)
班級和學生是一對多的關係。一個班級有多個學生,一個學生只能屬於一個班。在多的一端加入一一端的主鍵當做外鍵。這樣的冗餘是最少的。
hbm.xml文件配置:
在一的一端加入標籤映射
<hibernate-mapping>
<classname="com.bjpowernode.hibernate.Group"table="t_group">
<idname="id">
<generatorclass="native"/>
</id>
<propertyname="name"/>
<set name=”users”>
<key column=”groupId”/>
<one-to-many class="com.bjpowernode.hibernate.User">
</set>
</class>
</hibernate-mapping>
我們採用的是在一的一端維護關係。這樣的話,多的一端並不知道一的一端的存在。也就是說學生並不知道班級的存在。
四)多對多關聯映射
用戶和角色的關係。一個用戶可以有多個角色,一個角色可以有多個用戶。 n:n的關係,一定會有一張第三張表來維護他們的關係。
如果是user單向對role 那麼則在user的一端加入標籤映射。
hbm.xml文件配置:
<set name="roles" table="t_user_role">
<key column="user_id"/>
<many-to-many class="com.hibernate.Role" column="role_id"/>
</set>