1.一對一關聯
?1?<hibernate-mapping>
?2????<class
?3????????name="org.hibernate.sample.TUser"
?4????????table="t_user"
?5????????dynamic-update="true"
?6????????dynamic-insert="true"
?7????>
?9????????<one-to-one
10???????????name="group"<!--對應實體內屬性名稱-->
11???????????class="org.hibernate.sample.TGroup"<!--包括包名的實體-->
12???????????cascade="none"
13???????????outer-join="auto"
14???????????constrained="false"
15????????/>
17????</class>
18?</hibernate-mapping>
1?public?class?TUser?implements?Serializable?{
2????private?TGroup?group;
3????public?TGroup?getGroup()?{
4????????return?group;
5????}
6?}

2.一對多關聯
單向一對多關聯:
?1?<hibernate-mapping>
?2????<class
?3????????name="org.hibernate.sample.TUser"
?4????????table="t_user"
?5????????dynamic-update="true"
?6????????dynamic-insert="true"
?7?????>
?8????????<set?????? <!--使用set因為實體內屬性的類別為set。之所以使用set接口而不直接使用實現類,是因為hibernate自己實現了一個set,如果實體內屬性設定為jdk的HashSet,會拋轉型異常。-->
?9???????????name="addresses"<!--TUser實體內的addresses屬性-->
10???????????table="t_address"<!--“多”方的表名稱-->
11???????????lazy="false"<!--延遲加載,只是在需要讀取對應的屬性時候,才進行數據庫的查詢。而不是在啟動服務時候就已經全部把所有映射文件的關系讀取完畢,這樣提升了性能。-->
12???????????inverse="false"<!--inverse為false的一方負責維護關系,是主控方。所謂主控方就是數據庫的讀,存,刪,更新只能從主控方主導操作,被動方無法進行上述操作。這里是單向關系。-->
13???????????cascade="all"
14???????????sort="unsorted"
15????????????order-by="zipcode?asc"
16????????>
17?????????????<keycolumn="user_id"></key><!--“多”表內的字段名稱-->
21?????????????<one-to-many
22?????????????????class="org.hibernate.sample.TAddress"/><!--“多”方的類名,通過key元素的colunm屬性,找到對應的實體屬性-->
24????????</set>
25????</class>
26?</hibernate-mapping>
27?
雙向一對多關聯:
?1?<hibernate-mapping>
?2????<class
?3????????name="org.hibernate.sample.TUser"
?4????????table="t_user"
?5????????dynamic-update="true"
?6????????dynamic-insert="true"
?7????>
?8????????<set
?9???????????name="addresses"
10???????????table="t_address"
11???????????lazy="false"????????????????????????????????????????????????
12???????????inverse="true"
13???????????cascade="all"
14???????????sort="unsorted"
15???????????order-by="zipcode?asc"
16????????>
17?????????????<key?column="user_id"></key><!--對應表的字段。難道key屬性設置的都是對應表的字段?-->
18?????????????<one-to-many
19??????????????class="org.hibernate.sample.TAddress"
20?????????????/>
21????????</set>
22????</class>
23?</hibernate-mapping>
24?
?1?<hibernate-mapping>
?2????<class
?3????????name="org.hibernate.sample.TAddress"
?4????????table="t_address"
?5????????dynamic-update="false"
?6????????dynamic-insert="false"
?7????>
?8????????<many-to-one
?9???????????name="user"
10???????????class="org.hibernate.sample.TUser"
11???????????cascade="none"
12???????????outer-join="auto"
13???????????update="true"
14???????????insert="true"
15???????????access="property"
16???????????column="user_id"
17???????????not-null="true"
18????????/>
19????</class>
20?</hibernate-mapping>
21?
雙向關聯,依然存在主控方,被動方。但建立了雙向關聯后,從任何一方都可以讀取到對方的信息,不過更新,刪除,增加依然需要主控方進行維護。之所以單向不能互訪,因為有一方沒有在映射文件進行mapping,就沒辦法在讀取數據庫時候把相關數據填充。
1?TAddress?addr?=?new?TAddress();
2?addr.setTel("1123");
3?addr.setZipcode("233123");
4?addr.setAddress("Hongkong");
5?addr.setUser(user);//設置關聯的TUser對象,這步是必須的。TAddress為主控方,因此需要自己去維護與User的關系。
6?user.getAddresses().add(addr);
7?session.save(user);//級聯更新
8?

3.多對多關聯
多對多關聯需要建立一張中間表,以此表進行多對多的關聯。同時中間表需要對兩個“多”方表進行外鍵設定。
?1?<hibernate-mapping>
?2????<class
?3????????name="org.hibernate.sample.TGroup"
?4????????table="t_group"
?5????????dynamic-update="false"
?6????????dynamic-insert="false"
?7????>
?8????????<set
?9???????????name="roles"
10???????????table="t_group_role"<!--中間表-->
11???????????lazy="false"
12???????????inverse="false"
13???????????cascade="save-update"
14????????>
15?????????????<key?column="group_id"></key><!--中間表對應此表內的字段,通過外鍵對應到這張表的主鍵-->
16?????????????<many-to-many
17?????????????????class="org.hibernate.sample.TRole"
18?????????????????column="role_id"<!--對應“多”方表內的字段,通過外鍵找到對應表的主鍵-->
19??????????????/>
20????????</set>
21????</class>
22?</hibernate-mapping>
23?
?1?<hibernate-mapping>
?2????????<class
?3?????????name="org.hibernate.sample.TRole"
?4?????????table="t_role"
?5?????????dynamic-update="false"
?6?????????dynamic-insert="false"
?7?????????>
?8??????????<set
?9???????????name="groups"
10???????????table="t_group_role"
11???????????lazy="false"
12???????????inverse="true"
13???????????cascade="save-update"
14???????????sort="unsorted"
15????????>
16?????????????<key?column="role_id"></key>
17?????????????<many-to-many
18?class="org.hibernate.sample.TGroup"
19?????????????????column="group_id"
20?????????????????outer-join="auto"
21??????????????/>
22????????</set>
23????</class>
24?</hibernate-mapping>
25?
由于是多對多關聯,所以保存狀態時候需要把雙方同時保存。
1?TRole?role?=?new?TRole();
2?TGroup?group?=?new?TGroup();
3?role.getGroups.add(group);
4?group.getRoles.add(role);
//然后通過session把兩個對象都進行保存。session.add(role) ,session.add(group)