在学习Hibernate的时候,很大一部分任务量是配置实体映射关系,Hibernate的映射关系的关键就是掌握面向对象的思想,搞清楚实体之间的关系。每一个实体关系都对应这UML中的对象关系。我们配置这些对象的关系模型。下面分节讲述Hibernate的关系映射。
本节主要讲述Hibernate的一和多的关系。之所以称之为一和多的关系,是因为他包括三种关系:单向一对多,单向多对一,双向一对多。我这里统称为它一对多。一对多关系是非常重要的关系,也是现实世界中最多的关系。这三个关系对应的是UML中的关联关系,也可以分成聚合和组合。
之所以把一对多分成三种类型,是因为它们站的角度不同。这里就拿学生和班级的关系举例,站在学生的角度看这个关系是多对一,站在班级的角度看是一对多。但是为了更好的使用这个关系,也考虑到实际操作的原因。一般把它们设置成双向一对多。
单向多对一
单向多对一是站在多的角度去看关系的,在本例中就是站在学生的角度去看。首先看这个关系的UML图。
多个学生对应一个班级。这里的关系就是多对一的关系,站在学生的角度看。如果我们只是需要知道学生位于那个班级。这样就只是单向的关系,也就是拿到Student,hibernate会自动的给你抓取到对应的Classes。单向的多对一是由需求产生的。是人为的设定的。这样的关系中,Studnet一端负责维护关系。它的映射原理是在Studnet表的一段加入外键,指向一的一端。
下面看这两个实体对应的配置文件Student.hbm.xml和Classes.hbm.xml
关系在多的一端维护,就在多的一端配置。
单向一对多
同单向多一对的关系类似,单向一对多关系是同一个实体模型映射的不同关系模型。它是站在班级的角度去看问题的。也就是一的这一端去维护关系。也就是在加载一的时候,Hibernate会自动加载上多的一端数据。他的映射原理和单向一对多是一样的,都是在多的一端加入一个外键,指向一的一端。它的UML图如下,注意箭头的指向不同了。
对应的配置文件Student.hbm.xml和Classes.hbm.xml如下:
一的一端维护关系
双向一对多
上面的两种关系都是单向的,但是在实际应用中,我们往往需要双向的加载。比如我拿到学生想知道他所在的班级,拿到班级想知道班里面有的学生。这样就需要双向的关系。还有一个很重要的原因就是,单向一对多关系在维护关系的过程中存在很大的缺陷。在插入学生的时候,如果班级不能为空,则学生是插入不了的。还有如果插入成功,在开始解决班级字段是空的,在事务提交阶段,班级需要更新每一个学生的班级ID,这样会产生大量的Update语句。影响效率。所以一对多关系大多使用双向一对多映射。
双向一对多映射的UML图是这样的。
它是一个双向的关联(这里仅限于对Hibernate使用,和现实关系有不一致的地方)
双向一对多的配置文件Student.hbm.xml和Classes.hbm.xml如下:
它的映射原理是
- 在一的一端的集合上采用<key>标签,在多的一端加入一个外键
- 在多的一端采用<many-to-one>标签
也就是两端都要配置,和上面的两种有所不同。但是需要注意的是
- <key>标签和<many-to-one>标签加入的字段保持一直,否则会产生数据混乱
- 在一的一端加上inverse="true"属性,让一的一端不去维护关系,专业就不会发出更新语句。
下面解释一下配置文件中各个标签的意义和用法:
<many-to-one>
通过many-to-one元素,可以定义一种常见的与另一个持久化类的关联。这种关系模型是多对一关联(实际上是一个对象引用-译注):这个表的一个外键引用目标表的主键字段。
<one-to-many>
一对多关联,定义一个表的外键到另一个表的主键,另一个是多的一端。
<inverse>
inverse的值有两种,“true”和“false”。inverse="false"是默认的值,如果设置为true则表示对象的状态变化不会同步到数据库 ;设置成false则相反;
inverse的作用:在hibernate中是通过inverse的设置来决定是有谁来维护表和表之间的关系的。
需要说明的几点:
1:hibernate中的实体类和我们以前做的实体类不太一样,主要是以前的实体类如果包含其它表的字段,直接加上一个String或者int类型的数据就行。而Hibernate中需要加入的是一个实体类属性字段。但是两者生成的表是一样的。就像上面UML图体现的那样,第一个是Studnet实体类中有一个Classes类型的字段,第二个是Classes中有一个Student类型的集合。第三个是他们双方都有对方的一个引用。
2:一对多关系是比较常用的关系,很多时候都会映射出双向的一对多。
3:学习Hibernate要认真体会里面的实体关系,由此去推出映射关系。这里面用到了很多UML的知识。需要重点研究。
分享到:
相关推荐
在Java世界中,Hibernate是一个非常重要的对象关系映射(ORM)框架,它允许开发者将数据库操作转换为对Java对象的操作,极大地简化了数据库编程。SSH是Spring、Struts和Hibernate三个开源框架的简称,常被用于构建...
- `<set>`、`<list>`或`<bag>`:用于映射一对多或多对多关系。 - `<one-to-one>`、`<many-to-one>`:用于映射一对一或多对一关系。 通过`hibernate.cfg.xml`中的`<mapping>`节点引用`*.hbm.xml`文件,Hibernate能够...
多对一映射与一对多相反,通常用于实体类中引用另一个实体类的单个实例。使用`@ManyToOne`注解或XML中的`many-to-one`元素来实现。 **六、多对多(Many-to-Many)映射** 多对多关系需要通过中间表来实现,...
本文将更加深入地解析另一种重要的配置文件——`*.hbm.xml`,特别是如何通过此类文件来管理实体与数据库表之间的映射关系,以及处理复杂的关联关系,如一对一、一对多、多对一和多对多。 #### `*.hbm.xml`文件解析 ...
1. **一对多映射**:这里定义了一个班级与学生的关联关系,通过`<set>`元素指定一个班级可以拥有多名学生,`<key>`元素指定了外键`class`与班级表之间的关联。 2. **级联保存**:`cascade="save-update"`属性意味着...
3. 关系映射:一对一、一对多、多对一、多对多等关联关系。 四、查询语言(HQL)与Criteria API 1. HQL:Hibernate Query Language,面向对象的查询语言,类似于SQL,但操作的是对象而非表。 2. Criteria API:提供...
《SSH2框架集成详解——Hibernate、Spring与Struts2的深度整合》 SSH2,即Hibernate、Spring和Struts2的组合,是Java Web开发领域中广泛应用的三大框架。这三者结合,能够构建出高效、灵活且易于维护的企业级应用。...
**hibernate_esb配置详解** 在Java企业级开发中,Hibernate作为一个强大的对象关系映射(ORM)框架,被广泛用于简化数据库操作。而ESB(Enterprise Service Bus,企业服务总线)则作为企业集成的核心组件,负责不同...
- **一对多映射**:通过外键或集合方式实现。 - **多对多映射**:通过中间表实现。 - **单表继承**:所有子类共享一张表。 - **多表继承**:每个子类对应一张表。 - **表每类继承**:每个类对应一张表。 ### 四、...
有四种关联类型:一对一(OneToOne)、一对多(OneToMany)、多对一(ManyToOne)和多对多(ManyToMany)。通过注解如@OneToOne、@OneToMany、@ManyToOne、@ManyToMany进行关联映射。 三、Hibernate的优势 1. 面向...
“Hibernate高级特性”章节则进一步探讨了XDoclet与Hibernate映射、数据检索(包括CriteriaQuery和HQL)、数据关联(如一对一、一对多、多对多关系处理)、数据访问(PO和VO的使用)、事务管理、锁机制、分页、缓存...
14. MyBatis的一对一和一对多实现: 包括注解方式和XML配置方式,涉及单向和双向关联,需要正确设置外键和关联属性。 15. 延迟加载: MyBatis默认不支持延迟加载,但可以通过启用二级缓存和配置`...
8. 关联映射:探讨一对多、多对一、多对多等各种关联关系的映射配置,以及级联操作和懒加载策略。 9. 性能优化:包括缓存机制(一级缓存和二级缓存)、批处理和延迟加载等提高Hibernate性能的方法。 10. 实战项目...
- **一对多双向关联映射总结**:总结一对多双向关联的特点及其应用场景。 #### 多对多关联映射单向(many-to-many) - **实例场景**:比如用户与角色之间的关系。 - **对象模型**:展示了多对多关系。 - **Role...
关注Hibernate中一对一关系的映射方式。 - 问题6:选项D。考查Hibernate中的集合映射方式。 2. **填空题解析**: - 填空1:原子性、一致性、隔离性、持久性。这是数据库事务的四个基本属性,也被称为ACID特性。 ...
Hibernate支持多种对象关系映射,如一对一、一对多、多对一、多对多等。例如,如果你有一个`User`类和一个`Address`类,可以这样定义它们的关系: ```java @Entity @Table(name = "users") public class User { @...
了解了基本概念后,可以深入研究Hibernate的高级特性,如一对多、多对一、一对一和多对多的关联映射,级联操作,延迟加载,缓存机制,以及HQL(Hibernate Query Language)和Criteria API等。 总结,Hibernate通过...