Hibernate几种关系映射总结(单向关联)

使用Hibernate的关联映射可以大大简化持久层数据的访问。关联关系大体上可以分为两类:单向关联和双向关联。所谓单向关联是指:只需要单向访问关联端;双向关联是指关联的两端可以相互访问。下面,我们首先来谈谈单向关联:

1、单向多对一(N-1)

举一个生活中的一个简单例子:用户和组的关系就是明显的多对一关系,一个组里面有多个用户.我们使用单向的n-1来映射这种关系.

=============================================================================

public class User {
 
 private int id;
 
 private String name;
 
 private Group group;

 

//...setter、getter方法

 

}

 

-----------------------------------------------------------------------------------------------------------------------------------------------

public class Group {
 
 private int id;
 
 private String name;

 

//...setter、getter方法

 

}

-----------------------------------------------------------------------------------------------------------------------------------------------

 

配置相应的映射文件 User.hbm.xml

 

<hibernate-mapping>
 <class name="com.hcit.hibernate.User" table="t_user">
  <id name="id">
   <generator class="native"/>
  </id>
  <property name="name"/>
   <many-to-one name="group" column="groupid"/>
 </class>
</hibernate-mapping>

 

配置 Group.hbm.xml

 

<hibernate-mapping>
 <class name="com.hcit.hibernate.Group" table="t_group">
  <id name="id">
   <generator class="native"/>
  </id>
  <property name="name"/>
 </class>
</hibernate-mapping>

 

单向n-1关联关系映射小结:这里我们需要维护的关系是多个User可以对应同一个Group,我们只要在多的一端加上一个外键指向一的一端即可.本例中我们在User一端添加了一个groupid作为外键指向Group端。通过多的一端维护这种关联关系.

 

 

2、单向1-1关联映射

2.1 基于外键的单向1-1

 

这种方式比较简单,我们可以采用<many-to-one>标签,指定多的一端的unique="true",这样就限制了多的一端的多重性唯一

通过这种手段映射一对一唯一外键关联 修改配置文件:

<many-to-one name="group" column="groupid" unique="true"/>

 

2.2基于主键的单向1-1

这里我们也举一个简单的例子。每个人(Person)都有一张身份证(IdCard)

-----------------------------------------------------------------------------------------------------------------------------------------------

 

public class IdCard {
 
 private int id;
 
 private String cardNo;

 

//...setter、getter方法

 

}

 

-----------------------------------------------------------------------------------------------------------------------------------------------

 

public class Person {

 

 private int id;
 
 private String name;
 
 private IdCard idCard;

 

//...setter、getter方法

 

}

 

 

配置相应的映射文件IdCard.hbm.xml

 

<hibernate-mapping>
 <class name="com.hcit.hibernate.IdCard" table="t_idcard">
  <id name="id">
   <generator class="native"/>
  </id>
  <property name="cardNo"/>
 </class>
</hibernate-mapping>

 

配置Person.hbm.xml

 

<hibernate-mapping>
 <class name="com.hcit.hibernate.Person" table="t_person">
  <id name="id">
   <generator class="foreign">
    <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 

 

 

3、单向1-n关联映射

 

实例:我们知道一个班级有多名学生,这就是一个典型的1-N关系

 

public class Classes {
 

 private int id;
 

 private String name;
 

 private Set students; //集合

 

...//生成相应的getter、setter方法

}

 

 -----------------------------------------------------------------------------------------------------------------------------------------------

 

public class Student {


 private int id;


 private String name;

 

..//生成相应是getter、setter方法

 

}

 

 

 配置文件

 

<class name="Classes" table="t_classes">
  

<id name="id">
   <generator class="native"/>
  </id>
  <property name="name"/>
  

  <set name="students">
    <key column="classesid"/>//在一的一端添加的外键指向多的一端(默认情况下是主键匹配)
    <one-to-many class="Student"/>//注意它维护的是一指向多的关系
  </set>


 </class>

 

 映射原理:一对多关联映射,在多的一端添加一个外键classesid指向一的一端,它维护的关系是一指向多

 

 

 4、单向n-n关联映射

 

public class User {


 private int id;
 

 private String name;


 private Set roles; //集合

 

 ..//生成相应的getter、setter方法

 

}

 

 

public class Role {


 private int id;


 private String name;

 

..//生成相应的getter、setter方法

 

}

 

现在需要映射这样的N-N关系,一个User可以有多个Role,而一个Role有可以被多个User所拥有,

这样我们就可以将一个N-N关系拆分为两个N-1的关系 User.hbm.xml配置文件

<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="userid"/>
   <many-to-many class="Role" column="roleid"/>
  </set>
 </class>

 

//现在我们的关系明确了

 t_user                    t_user_role                     t_role     

 id  name   < -------userid     roleid   ----- >     id     name

 

 

 下面要谈谈双向关联关系了,双向关联主要有:双向1-1、双向1-N、双向N-N

 

未完待续....

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值