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的七种映射关系之七种关联映射

关联映射就是将关联关系映射到数据库里,在对象模型中就是一个或多个引用。     一、Hibernate多对一关联映射:就是在“多”的一端加外键,指向“一”的一端。   比如多个学生对应一个班级,多个用...
  • kevincol22
  • kevincol22
  • 2016年09月19日 10:37
  • 335

SSH框架之Hibernate的关联映射之一对多、多对一映射

关联映射之一对多、多对一映射 一、需求: 部门与员工 一个部门有多个员工 【一对多】 多个员工,属于一个部门 【多对一】 二、逻辑分析: 三、代码实现 1、javabean及映射文件的配...
  • qq_34944851
  • qq_34944851
  • 2016年12月19日 11:37
  • 1821

hibernate七种对应关系映射

hibernate框架七种对应的关系映射(ORM)
  • yangguirong123
  • yangguirong123
  • 2017年02月05日 10:23
  • 1049

Hibernate一对多关联映射(注解)

Hibernate一对多关联映射,维护端(一方,无外键方)可以进行关联移除,级联删除,级联保存,级联更新,级联刷新。被维护端(多方,外键方),不可以进行关联移除,级联操作,只能级联刷新。   ...
  • hardworking0323
  • hardworking0323
  • 2016年04月10日 18:35
  • 2729

【SSH进阶之路】Hibernate映射——多对一单向关联映射(四)

基本映射是对一个实体进行映射,关联映射就是处理多个实体之间的关系,将关联关系映射到数据库中,所谓的关联关系在对象模型中有一个或多个引用。...
  • jiuqiyuliang
  • jiuqiyuliang
  • 2014年10月22日 08:15
  • 31113

Hibernate(七)实现多对多关联映射关系

直接以老师与学生的关系为例。在多对多关联关系中,其中一方都可通过Set保留另一方的所有信息,这样的关联是双向关联。在多对多关联关系中,也只能是双向关联。老师和学生分别对应一张表,通过一张有双方id的中...
  • u011731233
  • u011731233
  • 2015年07月16日 20:28
  • 1675

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

概念          基本映射是对一个实体进行映射,关联映射就是处理多个实体之间的关系,将关联关系映射到数据库中,所谓的关联关系在对象模型中有一个或多个引用。   分类 ...
  • qq_27550755
  • qq_27550755
  • 2015年11月27日 14:38
  • 6763

Hibernate:组件属性和关联映射的区别

Hibernate:组件属性和关联映射的区别
  • VipMao
  • VipMao
  • 2016年08月01日 13:48
  • 1085

Hibernate注解版关联关系映射全解析+案例

HIbernate注解说明 [java] view plain copy   1、@Entity(name="EntityName")   必须,name为可选,对应数据库中一的个...
  • tengxing007
  • tengxing007
  • 2016年03月16日 10:54
  • 3638

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

1.Hibernate中关联关系可以分为: 单向关系:只能一张表指向另一张表。 双向关系:表与表之间可以互相指向。 2.根据关联的表的不同可以分为: 1对1关系 1对多关系 多对多关系 例如:1...
  • HLoach
  • HLoach
  • 2017年03月12日 22:14
  • 2440
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Hibernate框架开发笔记 lesson2 关联关系映射
举报原因:
原因补充:

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