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)