文档章节

Hibernate(三)——框架中的关系映射

凡尘里的一根葱
 凡尘里的一根葱
发布于 2015/11/11 00:52
字数 1691
阅读 61
收藏 2

在设计数据库时我们会考虑,表与表之间的关系,例如我们前边经常提到的一对一,一对多,多对多关系,在数据库中我们通过外键,第三张表等来实现这些关系。而Hibernate时间实体类和数据库中的表进行的映射,这些关系如何映射呢?这里简单总结一下:

  一,一对多,多对一关系映射,这里拿学生和班级进行简单演示:

  1,学生的类和对应的映射文件的编写:

private int sid ;  
private String sname ;  
  
private Classes classes ; //,引入班级对象,多对一
<class name="com.ljh.hibernate.pojo.Student" table="t_student" lazy="false">  
    <id name="sid" column="sid">  
        <generator class="native"/>  
    </id>  
    <property name="sname" column="sname" type="java.lang.String" length="20" not-null="true"/>         
      
    <!--   
        表示对象的关系:多对一  
        name 表示当前类的关系对象  
        column 表示数据库中外键字段(也是描述数据关系)  
        class 表示name属性值的类型  
        cascade 级联  
            主动方所做的操作(insert,update,delete),被动方也跟着做相同的操作。  
            取值:save-update、delete 、all  
            save-update : 保存或更新当前对象时,级联保存或更新关联对象  
            delete : 删除当前对象时,级联删除关联对象  
            all : 包含save,update,delete三种操作。  
            对于多对一的场合,级联不能使用delete和all,否则会违背数据关系完整性。  
        lazy : 延迟加载   
            延迟初始化对象信息,等使用对象时再查询数据库。   
            false : 禁用延迟加载  
            proxy : 使用延迟加载(默认值),采用cglib代理完成延迟加载的扩展功能。  
            no-proxy :  不使用代理,完成延迟加载 。可以使用第三方字节码增强工具。  
        fetch : 数据抓取策略  :根据主动方,查询被动方时所采用的查询方式。    
            fetch="select" 默认值,会采用多条语句的方式查找,往往会延迟加载数据  
            fetch="join"  默认会采用左连接查询数据,不会延迟加载数据。  
            not-null 如果取值为true,那么框架采用内连接查询数据。  
     -->  
    <many-to-one name="classes" column="cid" cascade="save-update" lazy="no-proxy" fetch="join" not-null="true" class="com.ljh.hibernate.pojo.Classes"></many-to-one>  
</class>

  2,班级的实体类和对应的映射文件:

private int cid ;  
private String cname ;  
  
private Set<Student> studentSet = new HashSet<Student>(); //引入学生类的集合,一对多


<class name="com.ljh.hibernate.pojo.Classes" table="t_classes" >  
    <id name="cid" column="cid">  
        <generator class="native"/>  
    </id>  
    <property name="cname" column="cname" type="java.lang.String" length="20" not-null="true"/>     
      
    <!-- 声明   一对多映射  
        lazy : 延迟加载  
            false : 禁用延迟加载  
            true : 延迟加载(默认值)  
            extra : 支持延迟加载的。(推荐)  
            当获取集合自身信息时,可以发送高效的查询语句。  
            例如:只希望获取集合的长度,而不需要获取集合中数据的信息,框架会通过函数执行查询进行计算集合长度。。  
      
        fetch : 数据抓取策略  
                查询关联对象的数据时,所采用的查询方式。  
            join : 通过一条连接语句进行立即查询。(延迟加载不起作用)  
            select : 通过多条查询语句进行查询。  
            subselect : 通过子查询语句进行立即查询。  (不推荐使用)(默认情况下和select取值结果相同)  
       not-null="true" 对于一对多的查询,即使设置了not-null语句,依然采用左连接查询。  
       Inverse="true",表示控制反转,由对方也就是学生方来进行管理外键。因为外键在学生    
     -->  
    <set name="studentSet" cascade="all" inverse="true" fetch="subselect">  
        <key column="cid" not-null="true"></key>  
        <one-to-many class="com.bjpowernode.hibernate.pojo.Student"/>  
    </set>  
</class>


    二,自关联:就是在自己的类进行关联自己,例如父菜单与子菜单的关系,对应的实体类,和映射文件

 

private int mid ;           

private String name ;  
          
private Set<Menu> menuSet = new HashSet<Menu>(); //父菜单与子菜单的关系为:一对多  
          
private Menu pmenu ; //子菜单和父菜单的关系为:多对一


<class name="com.ljh.hibernate.pojo.Menu" table="t_menu" >  
    <id name="mid" column="mid">  
        <generator class="native"/>  
    </id>  
    <property name="name" column="name" type="java.lang.String" length="20" not-null="true"/>   
      
    <many-to-one name="pmenu" column="m_id" cascade="save-update"></many-to-one>  
      
    <!--  
        自关联表的设计:外键字段不能为非空。 
     -->  
    <set name="menuSet" cascade="all" inverse="true">  
        <key column="m_id"></key>  
        <one-to-many class="com.ljh.hibernate.pojo.Menu"/>  
    </set>  
</class>


  三,一对一关系映射:

  1,假如是主键一对一用来映射:也就是说被动方的主键是来自于主动方的主键,也可以将之称之为外键:

    类之间相互添加彼此的应用。

    映射文件中主动方,增加一对一标签:

<one-to-one name="userinfo" cascade="all" class="com.ljh.hibernate.pojo.UserInfo"></one-to-one>  
被动方,主键又是外键,也添加一对一的映射标签:  
    <id name="uid" column="uid">  
        <generator class="foreign">  
            <param name="property">user</param>  
        </generator>  
    </id>  
      
    <!--   
        描述一对一关系关系映射  
        constrained="true" : 表示强制要求一对一使用外键关联。增加外键约束。  
     -->  
    <one-to-one name="user" constrained="true"  class="com.ljh.hibernate.pojo.User"></one-to-one>
  2 ,使用外键约束,其实是多对一的特殊情况,例如学生对班级,

    类添加彼此的应用。

    映射文件中学生端主动端,添加外键进行约束,添加多对一标签,

<!--   
    unique : 唯一约束  
      
        如果外键含有unique约束,那么表示主动方和被动方的关系为一对一。  
          
        对于一对一映射来讲,可以设置级联关系为delete 和 all  
          
        根据主动方查询被动方关联数据,是支持延迟加载的。  
 -->  
<many-to-one name="classes" column="cid" unique="true" cascade="all" class="com.ljh.hibernate.pojo.Classes"></many-to-one>  
班级端的映射文件:添加一对一的标签:  
<one-to-one name="student" cascade="all" property-ref="classes" class="com.ljh.hibernate.pojo.Student"></one-to-one>


   四,多对多的关系,例如学生对课程的对应,在数据库中会生成第三张表进行维护:

     在各自的类中引入对方的set集合,表示多对多。   

           学生端:

<set name="courseSet" table="t_student_course" cascade="save-update">  
    <key column="sid"></key>  
    <many-to-many class="com.ljh.hibernate.pojo.Course" column="cid"></many-to-many>  
  
;/set>

         课程端:

<set name="courseSet" table="t_student_course" cascade="save-update">  
    <key column="sid"></key>  
    <many-to-many class="com.ljh.hibernate.pojo.Course" column="cid"></many-to-many>  
  
;/set>




   五,联合主键的映射,这种情况很少见,看一下如何吧,

    出现了这种联合键时,需要我们为其定义一个联合主键的类(实现Serializable接口),类中声明多个字段的属性,表示联合主键字段。

    在配置映射文件时,主键的配置利用联合主键的标签即可:

<composite-id name="id"> 
  <key-property name="title"></key-property>  
  <key-property name="author"></key-property>  
</composite-id>


        综上,为 Hibernate中对数据库进行关联设置映射时的几个简单例子,主要是我们根据实际情况,掌握几个对应标签的使用,还有就是里边的属性的使用。像lazycascadefetch等等。注意观察其中的不同。这样进行了关联设置我们就可以很好的,根据类生成数据库,对数据库中的数据进行关联操作,更加合理化!

本文转载自:

凡尘里的一根葱
粉丝 36
博文 101
码字总数 12056
作品 0
深圳
程序员
私信 提问
Java专家之路(二)---数据访问和数据持久化框架的总结

Java数据访问和持久化(SQL) 方案一:JDBC 什么是JDBC? Java语言访问数据库的一种规范,是一套API。JDBC (Java Database Connectivity) API,即Java数据库编程接口,是一组标准的Java语言中的...

u011500356
2017/12/20
0
0
【持久化框架】Mybatis与Hibernate的详细对比

前言 这篇博文我们重点分析一下Mybatis与Hibernate的区别,当然在前面的博文中我们已经深入的研究了Mybatis和Hibernate的原理。 Mybatis 【持久化框架】Mybatis简介与原理 【持久化框架】Spr...

sietai
2018/05/18
138
0
java 私塾随堂笔记——Hibernate(上)

java 私塾随堂笔记——Hibernate(上) 第一章 Hibernate介绍 一.是什么: Hibernate是轻量级的ORM框架。 1.ORM(ORMapping) Object——Mapping——→Relation DB Object←——JDBC———Rel...

luodis
2011/03/21
446
0
Action、Dao、Service三层的功能划分

原文地址 Action是管理业务(Service)调度和管理跳转的。 Service是管理具体的功能的。 Action只负责管理,而Service负责实施。 DAO只完成增删改查,虽然可以1-n,n-n,1-1关联,模糊、动态...

木木侠
2017/05/14
0
0
ORM知多少

公司的项目中都涉及到ORM(Object Relational Mapping)框架,EF映射、Hibernate、Mybatis、JPA……不断涌现的新鲜词语,面试的时候面试官还在说EFframework(有木有很奇怪),那就来一探究竟吧...

zt15732625878
2017/10/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

UAVStack功能上新:新增JVM监控分析工具

UAVStack推出的JVM监控分析工具提供基于页面的展现方式,以图形化的方式展示采集到的监控数据;同时提供JVM基本参数获取、内存dump、线程分析、内存分配采样和热点方法分析等功能。 引言 作为...

宜信技术学院
17分钟前
4
0
MySQL的5种时间类型的比较

日期时间类型 占用空间 日期格式 最小值 最大值 零值表示 DATETIME 8 bytes YYYY-MM-DD HH:MM:SS 1000-01-01 00:00:00 9999-12-31 23:59:59 0000-00-00 00:00:00 TIMESTAMP 4 bytes YYYY-MM......

物种起源-达尔文
24分钟前
6
0
云服务OpenAPI的7大挑战,架构师如何应对?

阿里妹导读:API 是模块或者子系统之间交互的接口定义。好的系统架构离不开好的 API 设计,而一个设计不够完善的 API 则注定会导致系统的后续发展和维护非常困难。比较好的API设计样板可以参...

阿里云官方博客
27分钟前
5
0
Rancher + VMware PKS实现全球数百站点的边缘K8S集群管理

Sovereign Systems是一家成立于2007年的技术咨询公司,帮助客户将传统数据中心技术和应用程序转换为更高效的、基于云的技术平台,以更好地应对业务挑战。曾连续3年提名CRN,并且在2012年到2...

RancherLabs
32分钟前
5
0
6、根据坐标,判断该坐标是否在地图区域范围内

最近在写配送区域相关的代码,具体需求如下: 根据腾讯地图划分配送区域,总站下边设多个配送分站,然后将订单中的收货地址将其分配给不同的配送分站。 1、地图区域划分(腾讯地图) 1.1、H...

有一个小阿飞
34分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部