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               < key column ="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)