hibernate映射关系

来源:互联网 发布:手游推广联盟源码 编辑:程序博客网 时间:2024/06/03 18:23

       首先我们了解一个名词ORM,全称是(ObjectRelational Mapping),即对象关系映射。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现,这样开发人员就可以把对数据库的操作转化为对这些对象的操作。Hibernate正是实现了这种思想,达到了方便开发人员以面向对象的思想来实现对数据库的操作。       

        Hibernate在实现ORM功能的时候主要用到的文件有:映射类(*.java)、映射文件(*.hbm.xml)和数据库配置文件(*.properties/*.cfg.xml),它们各自的作用如下。

        映射类(*.java):它是描述数据库表的结构,表中的字段在类中被描述成属性,将来就可以实现把表中的记录映射成为该类的对象了。

        映射文件(*.hbm.xml):它是指定数据库表和映射类之间的关系,包括映射类和数据库表的对应关系、表字段和类属性类型的对应关系以及表字段和类属性名称的对应关系等。

       数据库配置文件(*.properties/*.cfg.xml):它是指定与数据库连接时需要的连接信息,比如连接哪种数据库、登录数据库的用户名、登录密码以及连接字符串等。当然还可以把映射类的地址映射信息放在这里。

       这里我来说一下hibernate的映射关系:

       

这里先对单向关联和双向关联做一个简单的解释,下面的问题就更好理解了。

单向关联:只需要单向的访问关联端。如规定老师可以访问学生,而学生不能访问老师。

双向关联:关联的两端可以相互访问。如老师和学生可以互相访问。

1、1与N的关系

(1)单向N-1关联:

1)定义:只需要N的一端访问1的一端。

2)如:用户和组,用户为N端,组为1端。多个用户在一个组中,只需要从用户这端找到他在哪个组,而哪个考虑这个组中有哪些用户。

3)图:

4)注:需要在N端加上1端的主键做为N端的外键,来指向1的一端

5)在N端的group.hbm.xml的文件中采用如下标签映射:

<many-to-onename="group" column="groupid"></many-to-one>

在hibernate.cfg.xml中要配置

<mappingresource="com/lsh/hibernate/**.hbm.xml"/>

也就是将hibernate与数据库的对象关系映射文件**.hbm.xml载入内存

(2)单向1-N关联:

1)定义:只需要1的一端访问N的一端

2)如:班级和学生,班级为1端,学生为N端,一个班级有多个学生,只需要从班级这端找到所有学生,而不需要学生去找到班级

3)图:

4)注:同N-1端一样,需要在N端加上1端的主键做为N端的外键,来指向1的一端

5)在1端的classes.hbm.xml的文件中采用如下的映射标签

<setname="students" >

       <key column="classesid"/>

        <one-to-many class="com.lsh.hibernate.Student"/>

 </set>

(3)双向1-N关联

1)定义:两端可以互相访问

2)如:如班级和学生,班级为1端,学生为N端,一个班级有多个学生,即可以从班级这端查找学生,也可以从学生这端找到班级。

3)图:

4)注:双向关联的时候,让其每一端都映射到classesid上。在1端维护关系存在缺陷,所以将单向的1-N关联都设置成双向的,将这个关系字段交给N端维护,不让1端维护,这样就可以保证只对其查找,不会对其更新。

5)在1端的classes.hbm.xml的文件中采用如下的映射标签

<set name="students"inverse="true">

          <key column="classesid"/>

          <one-to-many class="com.lsh.hibernate.Student"/>

</set>

6)在N端的student.hbm.xml的文件中采用如下的映射标签

   <many-to-one name="classes"column="classesid"></many-to-one>

2、1与1的关系

(1)单向1对1主键关联

 1)定义:其中某个1的一端访问另一个1的一端

 2)如:人和身份证, 1个人只有一张身份证,即可以根据这个人找到身份证,而不需要根据身份证去找这个人

3)图:

4)注:让两个对象具有相同的主键,以表明他们之间的一一对应关系;数据库表不会有额外的字段来维护他们之间的关系,仅通过表的主键来关联。

5)在1端的person.hbm.xml的文件中采用如下的映射标签

<class name="com.lsh.hibernate.Person" table="t_person"><id name="id">  <!--采用foreign生成策略,foreign会取得关联对象的标识  -->  <generator class="foreign">  <!-- property直关联对象 -->  <param name="property">idCard</param>  </generator></id><property name="name"></property><!--      one-to-one 指示hibernate如何加载其关联对象,默认根据主键加载     也就是拿到关系字段值,根究对端的主键来加载关联对象     constrained="true"表示,当前主键(person主键)还是一个外键     参照了对端的主键(IdCard的主键),也就是会生成外键约束语句   --> <one-to-one name="idCard" constrained="true"></one-to-one></class>

6)在1端的idCard.hbm.xml的文件中采用如下的映射标签

<class name="com.lsh.hibernate.IdCard" table="t_idCard"><id name="id"><generator class="native"/></id><property name="cardNo"/></class>

(2)单向1对1唯一外键关联

1)定义:其中某个1的一端访问另一个1的一端

2)如:人和卡,一个人有一张卡,即可以通过这个人去找到卡

3)图:

4)注:一对一唯一外键关联映射是多对一的特例,采用<many-to-one>标签来映射,指定多的一端unique为true,就是这样来映射的

5)在1端的person.hbm.xml的文件中采用如下的映射标签

<class name="com.lsh.hibernate.Person" table="t_person"><id name="id">  <generator class="native"></generator></id>       <property name="name"></property>       <many-to-one name="idCard" unique="true"></many-to-one>  </class>

(3)双向1对1主键关联

1)定义:两端可以互相访问

 2)如:人和身份证, 1个人有一张身份证,即可以根据这个人找到身份证,也可根据身份证去找这个人

   3)图:

4)注: 需要在IdCard加入<one-to-one>标签,指示hibernate将关联对象Person根据主键加载上来,<one-to-one>不影响存储,只影响加载

5)在1端的person.hbm.xml的文件中采用如下的映射标签

  

<class name="com.lsh.hibernate.Person" table="t_person">     <id name="id">        <!--采用foreign生成策略,foreign会取得关联对象的标识  --><generator class="foreign">    <!-- property直关联对象 -->    <param name="property">idCard</param></generator>     </id>     <property name="name"></property>     <!--       one-to-one 指示hibernate如何加载其关联对象,默认根据主键加载也就是拿到关系字段值,根究对端的主键来加载关联对象      constrained="true"表示,当前主键(person主键)还是一个外键 参照了对端的主键(IdCard的主键),也就是会生成外键约束语句      -->     <one-to-one name="idCard" constrained="true"></one-to-one></class>

6)在1端的idCard.hbm.xml的文件中采用如下的映射标签

<class name="com.lsh.hibernate.IdCard" table="t_idCard"><id name="id">   <generator class="native"/></id><property name="cardNo"/><one-to-one name="person" fetch="join"/></class>

(4)双向1对1唯一外键关联

1)定义:两端可以互相访问

2)如:人和卡,一个人有一张卡,即可以通过这个人去找到卡 ,也可以通过这张卡去找人

3)图:

4)注:一对一唯一外键关联双向采用<one-to-one>标签来映射,必须指定<one-to-one> 标签中property-ref属性为关系字段的名称

5)在1端的person.hbm.xml的文件中采用如下的映射标签

<class name="com.lsh.hibernate.Person" table="t_person">    <id name="id"><generator class="native"></generator>    </id>    <property name="name"></property>    <many-to-one name="idCard" unique="true"></many-to-one> </class>

6)在1端的idCard.hbm.xml的文件中采用如下的映射标签

<class name="com.lsh.hibernate.IdCard" table="t_idCard"><id name="id">    <generator class="native"/></id><property name="cardNo" /><one-to-one name="person" property-ref="idCard"></one-to-one></class>

3、N与N的关系

(1)单向N对N关联

1)定义:其中某个N的一端访问另一个N的一端

   2)如:用户和角色,每个用户有多个角色,每个角色有多个用户,这里表示的是用户可以去查找角色,而不能角色查找用户

3)图:

4)注:多对多关联映射,需要一个中间表,hibernate会自动生成中间表,跟一对多一样,也是用集合来表示

5)在N端的user.hbm.xml的文件中采用如下的映射标签

<class name="com.lsh.hibernate.User" table="t_user"><id name="id"><generator class="native"/></id><property name="name"/><set name="roles" table="t_user_role">     <key column="user_id"/>     <many-to-many class="com.lsh.hibernate.Role" column="role_id"></many-to-many></set></class>

6)在1端的role.hbm.xml的文件中采用如下的映射标签

<class name="com.lsh.hibernate.Role" table="t_role"><id name="id">     <generator class="native"/></id><property name="name"/></class>

(2)双向N对N关联

1)定义:两端可以互相访问

   2)如:用户和角色,每个用户有多个角色,每个角色有多个用户,用户可以查找角色,角色也可以查找用户

3)图:

4)在N端的user.hbm.xml的文件中采用如下的映射标签

<class name="com.lsh.hibernate.User" table="t_user"><id name="id"><generator class="native"/></id><property name="name"/><set name="roles" table="t_user_role"><key column="user_id"/><many-to-many class="com.lsh.hibernate.Role" column="role_id"></many-to-many></set></class>

5)在1端的role.hbm.xml的文件中采用如下的映射标签

<class name="com.lsh.hibernate.Role" table="t_role"><id name="id">     <generator class="native"/></id><property name="name"/><set name="usersSet" table="t_user_role">      <key column="role_id"/>      <many-to-many class="com.lsh.hibernate.User" column="user_id"></many-to-many></set></class>
这里只对简单主键做了总结,下面还会对复合主键和继承映射做相应的总结!

0 0
原创粉丝点击