Hibernate框架开发笔记 lesson2 关联关系映射

原创 2016年08月29日 18:20:31

关联关系映射

   jdbc:    使用   join  多表连接

   Hibernate:  对象   关联映射 通过一个对象,就可以把关联的对象查询出来


一对一(唯一外键一对一)

    学生 和学生证(paper) 的关系一对一

例表如下

   Student     table  
      sid(pk)  sname  sex

   Paper   table
      pid(pk)   pdesc  sid(fk)
   
   在Student实体类的添加关系属性
      private Paper paper ; 表示这个个学生对象拥有这个学生证

配置student.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="entity">
   <class name="Student"  table="student">
    <id name="sid"   type="integer">
  
         配置主键生成器():
           assigned:  程序员自己指定  一般不用  因为程序员不知道数据库内数据随意指定会造成主键重复
           increment:  自增的   底层原理max(id)+1     企业生产环境一般不用(多人同时操作时会造成主键重复冲突)   
           native  :  本地数据库的自增策略(根据安装的数据库类型)实现主键自增 删除记录后,再添加不会出现之前的主键值
                             mysql:  auto_increment,  要求建表的时候一定加上auto_increment
                             oracle: sequence  通过序列(oracle中的对象)来自增   要求有对应的序列 
                             sqlserver: identity  要求建表的 时候  加上identity
           uuid  :  采用uuid算法 会生成32位 由 字母 数字  组成的  不重复的字符串 
           sequecne:  只能用在支持sequece序列的数据库(oracle等)中
         <generator class="native"></generator>
    </id>
<property name="sname" type="string"></property>
    <property name="sex" type="string"></property>
 <!--  配置关系属性    与Paper的一对一的关系
      配置关系属性四要素:
         1)关系属性名
  (要配的属性)   
         2)关系属性名对应
类名  (底层实际要找对应的表名)
         3)配置外键:间接配置外键  通过参照了Paper类的关系属性(student) 间接获取外键列
   
                      直接配置的  column="sid"
             间接配置: property-ref="属性名"
          4)级联  cascade 选配  操作一个对象是否要影响另一个对象   谨慎配置     none/delete/save-update/all
    -->
    <one-to-one name="paper" class="Paper"  property-ref="student" cascade="all">
    </one-to-one>
   </class>
</hibernate-mapping>
                 

    在Paper实体类的添加关系属性
       private Student  student ; 表示这个个学生证对象属于这个学生

 配置student.hbm.xml

   <!-- 配置关系属性   与Student的一对一的关系
       unique:true   外键不能重复  通过这个属性 使many to one 表达成了一对一
       配置关系属性的四要素:
        a.name  配置关系属性名  
        b.class   配置关系属性对应类
        c.column   直接配置外键
        d.配置级联  cascade none/save-update/delete/all
       -->
  <many-to-one name="student" class="Student" column="sid"unique="true" cascade="none"></many-to-one>
 

  共享主键一对一

  person  和 passport 一对一   用一列同时充当主键和外键
例表如下
  person(人)
  pid(pk)   pname   psex
   101        张三    男
   102        李四    女
 passport(护照)
         pid(pk+fk)    ptype    expire  
          101           美国护照      2
          102           英国护照      3

    在Passport实体类添加关系属性
 Person  person   一个护照属于一个人 

配置 person.hbm.xml

   <!-- 配置关系属性  与Passport的一对一的关系 
       在共享主键一对一中: 不用配置外键 
         hibernate能知道Passport对应的表的主键就是外键
      -->
     <one-to-one name="passport" class="Passport" cascade="none">
     </one-to-one>

配置 passport.hbm,xml

<id name="pid"  type="integer">
  <!-- 
    主键生成器:  不能自己指定 ,必须参照别人的
      foreign:参照外部一个属性  来获取主键值  一般只用在共享主键一对一
          配置的是Passport的关系属性名(person)
   -->
<generator class="foreign">
<param name="property">person</param>
</generator>
</id>

<!-- 配置关系属性 与Person的一对一的关系 
 在共享主键一对一中不需要配置外键,
   hibernate知道passport表的主键就是外键
   constrained:当前方是子表
-->
<one-to-one name="person"  class="Person"   cascade="none" constrained="true"></one-to-one>
                constrained = "true" 表明当前一方为子表 (需参照父表)

一对多:

  班级和学生的一对多
表如下
      grade
   gid(pk)       gname     
      1                  3a
      2                  3b
 
 student
          sid   sname  sex   gid(fk)
           10     张三     男       1
           20     李四     女       1 


grade 实体类中配置与学生一对多的关系属性
   private Set<Student>students = new HashSet<Student>()

student 实体类中配置与班级多对一的关系属性
   private Grade grade; 



配置grade.hbm.xml

  
<!-- 配置关系属性 
 与Student的一对多的关系
a.关系属性名  name
b.关系属性类名 class
c.外键 column
d.级联  cascade

  inverse:反转   student与grade的外键关系 交给谁来维护  只有set标签有
      true: 对方来维护  一般是交给多方来维护
            提升性能
 
fetch: 抓取策略  查询的机制    意义不大

      lazy:懒加载(延迟加载)
      false:       立即加载       在查询班级的时候 立即将这个班级中学生信息查询出来
      true :       延迟加载   在查询班级的时候 不会立即将这个班级的学生信息查询出来, 
      在使用或者获取学生的信息的时候 才去延迟查询.
 

<set  name="students" cascade="all"  lazy="true" inverse="true">配属性名
<key column="gid"></key>           配外键
<one-to-many class="Student"/>  配关系属性类名
 </set>

配置 student.hbm.xml

<many-to-one name="grade"  class="Grade"  column="gid"   cascade="none">
    </many-to-one>

多对多

  学生和课程多对多
 
例表如下
   student
     sid(pk)    sname    sex   
 101       张三       男      
 102       李四       女      
  sc(关系表  中间表)   
   sid(fk)    cid(fk)
     101       10
     101       20
     102       10
     102       20
 
   course
      cid(pk)       cname     
        10             struts2  
         20            hibernate   


 
sql:
  查询张三选了哪些课程(课程名称):
    select s.sname,c.cname
   from  student  s    join   sc    on  s.sid=sc.sid
      join   course  c    on    c.cid= sc.cid   where  s.sname='张三';  
       
   select s.sname,c.cname
   from  student  s    join   sc    on  s.sid=sc.sid and  s.sname='张三'
      join   course  c    on    c.cid= sc.cid ;


 
 student实体类中配置与课程多对多的关系属性
   private Set<Course>courses = new HashSet<Course>()

course 实体类中配置与学生多对一的关系属性
   private Set<Student>students= new HashSet<Student>(); 

配置student.hbm.xml

<!-- 配置关系属性  与Course的多对多关系
      结论:   三表 俩外键 
     1)关系属性名
     2)关系属性类
     3)外键
     4)级联
    -->
    <set name="cs"  table="sc" cascade="all" inverse="true"> 关系属性名 中间表
      <key  column="sid"></key>   学生表和关系表的关系外键
      <many-to-many class="Course"  column="cid"></many-to-many>  关系属性类名 ,关系表和另一个表的外键
    </set>

 配置course.hbm.xml

 <!-- 配置关系属性    与Student多对多关系  -->
    <set name="students" table="sc">
       <key column="cid"></key>
    <many-to-many class="Student"  column="sid"> </many-to-many>
    </set>


扩展:  

  设计表的原则(规范):三范式
     第一范式:   
   字段不可分割的  原子性的
     第二范式:
       每个表必须要有唯一标识的列 (表中必须有主键)     
     第三范式:
    a表的的一列参照了b的某列,     
    a表的别的列只能参照b表的其他列(参照唯一)
 

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Hibernate框架中在.hbm.xml映射文件中配置表与表之间的关联关系

1.Hibernate中关联关系可以分为: 单向关系:只能一张表指向另一张表。 双向关系:表与表之间可以互相指向。 2.根据关联的表的不同可以分为: 1对1关系 1对多关系 多...
  • HLoach
  • HLoach
  • 2017年03月12日 22:14
  • 1870

Hibernate框架基础——多对多关联关系映射

多对多关联关系映射多对多的实体关系模型也是很常见的,比如学生和课程的关系。一个学生可以选修多门课程,一个课程可以被多名学生选修。在关系型数据库中对于多对多关联关系的处理一般采用中间表的形式,将多对多的...

SSH:Hibernate框架(七种关联关系映射及配置详解)

概念          基本映射是对一个实体进行映射,关联映射就是处理多个实体之间的关系,将关联关系映射到数据库中,所谓的关联关系在对象模型中有一个或多个引用。   分类 ...

Hibernate框架基础——一对多关联关系映射

上一篇文章Hibernate框架基础——映射集合属性详细讲解的是值类型的集合(即集合元素是普通类型)。现在从本文开始我们就要介绍实体类型的集合(即集合元素是另一个实体)了。一对多关联关系映射我们还是以...

J2EE系列之Hibernate4学习笔记(五)--关联关系一对多映射

上一篇博客实现了一对多单向实现,现在实现双向关联。 一、班级学生一对多映射实现(双向) 1.一个班级里面多个学生,在班级类中添加学生类集合属性: package com.test.model; im...

J2EE系列之Hibernate4学习笔记(四)--关联关系一对多映射

以班级学生为例进行一对多关联的学习。这里实现班级到学生的单向关联。 一、班级学生一对多映射实现(单向) 1.在上一个工程的基础上新建一个班级类:Class package com.test.mo...

Hibernate框架之关联关系(many-to-one)

今天天气终于放晴了,心情也会好一些。年前这段时间,打算多写点文章,将自己的东西记录下来,算是一种沉淀吧。目前写的东西都是偏基础,也是计划从基础开始写起,后面再慢慢去扩充。 这篇文章打算记录一下Hib...

SSH框架之Hibernate的多对多映射、多对多关联关系维护(inverse)

一、Hibernate的多对多映射 1、需求: 2、代码实现: 1)javabeans以及映射文件的配置 a)Project.java、Project.hbm.xml b)Develop...

【hibernate框架】关系映射之一对一单向外键关联(XML实现)

在XML里面如何单向关联: 学生证与学生卡是一对一的关系,在学生证那一方做关联 Student.java: package cn.edu.hpu.model; public class St...

Hibernate学习笔记3--映射关联关系

1.多对一(以customer和order为例子) 属性:customer:customerId,customerName order:orderId,orderName,Customer cust...
  • wu_0916
  • wu_0916
  • 2017年04月09日 11:21
  • 120
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Hibernate框架开发笔记 lesson2 关联关系映射
举报原因:
原因补充:

(最多只允许输入30个字)