上篇文章总结了对象之间的一对一映射。而在关系模型中,最常见的映射为一对多和多对多。
一对一映射主要用到的标签<one-to-one>,一对多主要用到<many-to-one>和<one-to-many>,多对多用到<many-to-many>.下面一一来看。
(五)单向一对多映射
一对多映射情况非常多件,今天以班级和学生举例,一个班级对应多个学生,一个学生对应一个班级,从而形成一对多关系。如图:
一对多关系由一的一方来维护,在这个例子里由classes来维护,通过在配置文件中加入set标签,这个用来存放student表中的记录。One-to-many标签指定存放的内容
因为classes对象要持有多个student对象,所以在classes实体类中需要有个属性Set容器来存放student对象。
Classes.java
Classes类的配置文件中对Set属性的陪住需要使用专门的set标签,,<key column=”classesid”>是映射到多的一端表student中的列名,然后需要用到<one-to-many>标签,在这个标签里说明了set属性中存放的是student类的对象。
Classes.hbm.xml
由于student类不进行关系维护,所以student类的配置正常配属性就可以。
一对一关系映射的关系由一的一端维护,而在一的一端维护关系存在以下缺陷:
1、因为多的一端Student不知道Classes的存在(也就是Student没有维护与Classes的关系)
所以在保存Student的时候关系字段classesid是为null的,如果将该关系字段设置为非空,则将无法保存数据
2、另外因为Student不维护关系,而Classes维护关系,Classes就会发出多余的update语句,保证 Classes和Student有关系,这样加载Classes的时候才可以把该Classes对应的学生加载上来
由于一的一端维护关系的效率并不高,所以这种映射方法不提倡使用。一般来说这种关系有要配置成双向的,继续来看。
(六)双向一对多映射
采用一对多双向关联映射的目的主要是为了主要是为了解决一对多单向关联的缺陷而不是需求驱动的。
一对多的双向映射在(五)的基础上,需要在student的一端加一个classes属性,来存放student所属的classes信息。在student的配置信息中需要对classes属性配置<many-to-one>标签,这个标签中的列名需要与classes中<key>标签规定的列名保持一致,才能使双方加载正确,否则会产生数据混乱。
其中classes的实体类与(五)相同,不在赘述。
Student.java
Student.hbm.xml
下面介绍一个重要的属性inverse:
inverse属性可以用在一对多和多对多双向关联上,inverse属性默认为false,为false表示本端可以维护关系,如果inverse为true,则本端不能维护关系,会交给另一端维护关系,本端失效。
所以一对多关联映射我们通常在多的一端维护关系,让一的一端失效,所以设置为inverse为true。
所以改良后的classes.hbm.xml:
(七)单向多对多映射
一般的设计中,多对多关联映射,需要一个中间表,hibernate会自动生成中间表hibernate使用<many-to-many>标签来表示多对多的关联。
多对多的关联映射,在实体类中,跟一对多一样,也是用set集合来表示。
多对多采用用户和角色的例子来说明,一个用户可以有多个角色,一个角色也可以包含多个用户。如下图:
单向映射由User来维护关系,所以User实体类中需要有Set集合属性来存放Role的值。
Role.java
User.java
因为User维护关系,所以Role的映射写法就是简单的映射
Role.hbm.xml
User.hbm.xml
(八)双向多对多映射
双向映射就要在Role的一端持有User对象,那么在Role的实体类中就需要加上Set集合属性。并在配置文件中加入<many-to-many>标签配置。
User实体类和User的映射文件与(七)相同。
Role.hbm.xml
Role的配置与User相同,都是用到<many-to-many>标签,需要注意的是,User和Role映射出来的第三方表是同一张,所以名称需要相同,生成的中间表中的字段必须一样,否则加载出错。
总结:
一对多映射中用到一的一端用到<one-to-many>标签,多的一端用到<many-to-one>标签。实体类持有多个对象的属性应使用Set集合属性,对应的配置中同样使用<set>标签。
此外由于一对多映射由一方控制有缺陷,所以采用双向映射,并通过Inverse属性控制反转,使一端不维护关系。
多对多映射使用<many-to-many>标签,需要指定第三个表。如果是双向映射,必须保证多对多双方映射的第三方表名称相同,字段相同。
分享到:
相关推荐
在实际开发中,理解并熟练运用这些核心概念和机制,可以帮助我们更高效地利用Hibernate ORM进行数据访问层的设计,减少数据库操作的复杂性,提高代码的可维护性。对于初学者,建议从简单的JAR包开始,逐步熟悉其API...
Hibernate作为Java领域广泛使用的ORM框架,它极大地简化了数据库操作,将面向对象的编程思想与关系型数据库相结合,使得开发者可以更加专注于业务逻辑,而不是繁琐的SQL语句。在本书中,作者深入浅出地讲解了如何...
Hibernate核心思想与接口简介 Hibernate 是一个采用 ORM 机制的开源框架,核心思想是将表与表之间的操作,映射成对象和对象之间的操作,这样简化了持久层的代码,减轻了程序员的负担。ORM 是一种为了解决面向对象与...
首先,ORM框架的核心思想是将数据库表与Java类进行映射,表中的每一行对应一个Java对象,列则对应对象的属性。在本文中,作者可能会介绍如何设计这种映射机制,包括类的设计、属性的注解以及如何建立类与表之间的...
ORM的核心思想是将对象模型(对象、类、继承、关联等)映射到关系模型(表、字段、外键等)。这样,开发者可以使用面向对象的语言(如Java)操作对象,而ORM框架负责在后台将这些操作转化为相应的SQL指令,与数据库...
首先,Hibernate的核心功能在于它的ORM机制。ORM允许开发者使用面向对象的方式来处理数据库操作,避免了繁琐的SQL语句编写。通过Hibernate,Java对象可以直接映射到数据库表,对象的属性对应于表的列,对象实例则...
通过对Hibernate3源码的深入研究,我们可以了解到ORM框架的设计思想,掌握其实现机制,这对于提升我们的编程技艺,理解和设计自己的ORM框架,乃至整个软件架构,都大有裨益。尽管Hibernate3已是旧版,但其背后的理论...
ORM是Hibernate的核心思想,它消除了传统JDBC编程中的繁琐工作,如手动编写SQL语句和处理结果集。通过ORM,开发者可以使用面向对象的方式来操作数据库,提高开发效率并减少错误。 在Hibernate 3.3中,实体类是与...
对于初学者,它能帮助快速理解和掌握ORM的核心思想,而对于有经验的开发者,中文版文档则有助于在遇到问题时进行快速查阅和定位。 其次,hibernate-annotations-3.4.0GA是Hibernate支持JPA(Java Persistence API)...
ORM是Hibernate的核心思想,它允许开发者用面向对象的方式处理数据库操作。通过ORM,Java对象可以直接映射到数据库表,简化了数据存取过程,降低了数据库操作的复杂性。 2. **配置文件与实体类** 在`hibernate-...
Hibernate提供了缓存机制,如一级缓存(Session级别的)和二级缓存(SessionFactory级别的),以提高性能。另外,合理的配置和使用批处理、延迟加载等特性也能有效提升应用性能。 10. 扩展与进阶: Hibernate支持...
ORM的核心思想是将数据库中的表映射为Java对象,将表中的记录映射为对象的实例,这样就可以通过操作对象来间接操作数据库。在Hibernate中,这一映射关系通常通过XML配置文件或者注解来定义。 在JDK5.0引入的注解...
《Hibernate 开发文档详解》 ...通过阅读和实践,开发者不仅可以学习到如何使用Hibernate进行数据库操作,还能了解到ORM框架的设计思想和最佳实践,从而在实际项目中更好地利用Hibernate提升开发效率和应用质量。
ORM的核心思想是将对象模型和关系模型进行桥梁式连接,以提高开发效率。 **二、Hibernate Fetch策略** 在`hibernate_fetch_1`示例中,我们了解到Hibernate的加载策略,包括Eager Fetching(即时加载)和Lazy ...
通过深入学习Hibernate 4.1.4.Final的源码,我们可以更好地理解其设计思想,提升我们的编程技巧,同时也能为日常开发中遇到的问题提供解决方案。这是一份宝贵的资源,无论是对于初学者还是经验丰富的开发者,都值得...
本篇文章将针对“hibernate-3.0.zip”这一版本进行详细讲解,带你深入理解Hibernate 3.0的核心机制,以及如何在实际项目中有效地运用它。 一、Hibernate 3.0概述 Hibernate 3.0是Hibernate系列的一个重要版本,它在...
这些框架各有特点,但核心思想都是通过映射配置,将Java类和数据库表对应起来,使得Java对象可以直接操作数据库中的记录。 **Hibernate** 是一款强大的ORM框架,它提供了全面的对象关系映射解决方案,包括查询语言...
ORM框架如Hibernate的核心思想是通过将Java对象映射到数据库表,使得开发者可以专注于业务逻辑,而不是繁琐的SQL语句。相比于传统的JDBC,ORM框架提供了一种更加面向对象的方式来处理数据库交互,减少了代码量并提高...
【hibernate3 jar包详解】 ...同时,由于Hibernate3已经有些年份,虽然在某些现代项目中可能不再使用,但它作为ORM框架的代表,对于理解ORM思想和后续学习新版本的Hibernate或其他ORM框架仍然具有很高的价值。
ORM的核心思想是将数据库中的表与程序中的类进行映射,表中的行映射为类的实例,表中的列映射为类的属性。这样,当我们在程序中操作对象时,实际上是在操作数据库中的数据。ORM框架会自动处理SQL的生成和执行,以及...