在设计数据库时我们会考虑,表与表之间的关系,例如我们前边经常提到的一对一,一对多,多对多关系,在数据库中我们通过外键,第三张表等来实现这些关系。而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,假如是主键一对一用来映射:也就是说被动方的主键是来自于主动方的主键,也可以将之称之为外键:

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

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

    类添加彼此的应用。

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

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

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

学生端:

课程端:

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

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

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

Hibernate(三)——框架中的关系映射的更多相关文章

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

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

  2. 详解Java的MyBatis框架中SQL语句映射部分的编写

    这篇文章主要介绍了Java的MyBatis框架中SQL语句映射部分的编写,文中分为resultMap和增删查改实现两个部分来讲解,需要的朋友可以参考下 1.resultMap SQL 映射XML 文件 ...

  3. [原创]java WEB学习笔记81:Hibernate学习之路--- 对象关系映射文件(.hbm.xml):hibernate-mapping 节点,class节点,id节点(主键生成策略),property节点,在hibernate 中 java类型 与sql类型之间的对应关系,Java 时间和日期类型的映射,Java 大对象类型 的 映射 (了解),映射组成关系

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  4. Hibernate 中对象关系映射(ObjectRelationMapping)

    1.什么是对象关系映射? 解析:对象-关系映射(Object Relational Mapping,简称ORM,对象关系映射)是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的说, ...

  5. Hibernate基础学习(五)—对象-关系映射(下)

    一.单向n-1 单向n-1关联只需从n的一端可以访问1的一端. 域模型: 从Order到Customer的多对一单向关联.Order类中定义一个Customer属性,而在Customer类不用存放Or ...

  6. Hibernate基础学习(四)—对象-关系映射(上)

    一.映射对象标识符      Java语言按内存地址来识别或区分同一个类的不同对象,而关系数据库按主键值来识别或区分同一个表的不同记录.Hibernate使用对象标识符(OID)来建立内存中的对象和数 ...

  7. Hibernate -- 注解(Annotation)关系映射

    转自:http://www.cnblogs.com/tyler2000/archive/2011/01/20/1940354.html 1. Hibernate Annotation关系映射有下面几种 ...

  8. hibernate实体xml一对多关系映射

    单向一对多关系映射: 一个房间对应多个使用者,也就是Room實例知道User實例的存在,而User實例則沒有意識到Room實例. 用户表: package onlyfun.caterpillar; p ...

  9. 170905-MyBatis中的关系映射

    ===关系映射=== 参考文档复习:1对1,1对多,多对多 1.映射(多)对一.(一)对一的关联关系 1).使用列的别名 ①.若不关联数据表,则可以得到关联对象的id属性 ②.若还希望得到关联对象的其 ...

随机推荐

  1. 【CSS3】横屏引导小动画

    演示地址:http://codepen.io/anon/pen/oXbXdX 主要知识点: @media all and (orientation : landscape) { /* 这是匹配横屏的状 ...

  2. Git冲突解决方案

    Git冲突解决方案 1.  在代码提交时,先更新,若有冲突.先解决冲突.若提交之后在review时才发现无法合并代码时有冲突,需要abandon此次提交的代码. 2.  解决冲突的基本做法,保存本地代 ...

  3. 关于Go语言共享内存操作的小实例

    <strong style="margin: 0px; padding: 0px; border: 0px; font-size: 15px; font-weight: bold; c ...

  4. Vagrant入门[转]

    Vagrant是一个简单易用的部署工具,用英文说应该是orchestration tool.它能帮助开发人员迅速的构建一个开发环境,帮助测试人员构建测试环境. Vagrant的基本工作原理大致如下: ...

  5. angularJS自定义过滤器、服务和指令

    自定义过滤器 mainApp.filter('mayfilter',function(){ return function(input){ (过滤逻辑代码) } });   自定义创建指令 mainA ...

  6. 单例模式(Singleton)详解——转载

    单例模式(Singleton) 首先来明确一个问题,那就是在某些情况下,有些对象,我们只需要一个就可以了, 比如,一台计算机上可以连好几个打印机,但是这个计算机上的打印程序只能有一个, 这里就可以通过 ...

  7. web并发访问的问题

    一般的webapplication,可能会遇到这样的问题,你可以这样模拟:用浏览器开一个窗口,选中一条记录,编辑之,但是先不要保存,新开一个浏览器窗口,找到这条记录,删除之,然后再回到第一个窗口点击保 ...

  8. java equals 心得体会

    要记住最有用的一点: equals 在已经被系统定义好的类中 是已经被重写好了的 父类中的 equals方法是比较的两个对象是否指向同一引用 在被定义除了父类以外比较的是两个对象的内容 因此 人为定义 ...

  9. IOS 创建App的最佳捷径

    简网App工场   ----------------创建App的最佳捷径

  10. 在Eclipse中运行hadoop程序

    1.下载hadoop-eclipse-plugin-1.2.1.jar,并将之复制到eclipse/plugins下. 2.打开map-reduce视图 在eclipse中,打开window--> ...