【SSH进阶之路】Hibernate基本原理(一) ,小编介绍了Hibernate的基本原理以及它的核心,采用对象化的思维操作关系型数据库。
【SSH进阶之路】Hibernate搭建开发环境+简单实例(二),小编搭建了基本Hibernate的开发环境,并做了一个简单实例,对它的基本原理有了一个理性的认识。
【SSH进阶之路】Hibernate基本映射(三),我们介绍了Hibernate的基本映射(即对一个实体进行映射)的相关概念,并给大家实现相关实例,比较简单。
这篇博客,我们开始介绍基于基本映射的关联关系映射。
概念
基本映射是对一个实体进行映射,关联映射就是处理多个实体之间的关系,将关联关系映射到数据库中,所谓的关联关系在对象模型中有一个或多个引用。
分类
关联关系分为上述七种,但是由于相互之间有各种关系,可以简化,例如:多对一与一对多映射,只是侧重的角度不对而已。
映射技巧
映射技巧是小编写映射文件的过程,总结的经典内容,总共分为四步,咋看不是特别易懂,但是效果很好。下面我们以实例看技巧。
(1)写注释
格式为:?属性,表达的是本对象与?的?关系。
解释:在写映射文件之前先写注释,将问号的地方填上相应的内容。例如:<!-- group属性,表达的是本对象(User)与Group的多对一的关系-->
(2)写映射的框架(拷模版)
多对一 |
<many-to-one name=“” class=“” column=“”/> |
一对多 (Set) |
<set name=""> <key column=""></key> <one-to-many class=""/> </set> |
多对多 (Set) |
<set name="" table=""> <key column=""></key> <many-to-many class="" column=""/> </set> |
(3)填空
填空,就是将映射的框架信息,填写完成,完成映射文件。
• name属性:属性名(注释中的第1问号)
• class属性:关联的实体类型(注释中的第2个问号)
• column属性:
○ <many-to-one column="..">:一般可以写成属性名加Id后缀,如属性为group,则column值写成groupId。
○ 一对多中的<key column="..">:从关联的对方(对方是多对一)映射中把column值拷贝过来。
○ 多对多中的<key column=“..”>:一般可以写成本对象的名加Id后缀,如本对象名为User,则写为userId。
○ 多对多中的<many-to-many column=“..”>:一般可以写为关联对象的名称加Id后缀。
(4)完成
将映射文件添加到hibernate.hbm.xml中,这个相信大家都知道为什么。
我们后面所有关联映射的博文都使用此映射技巧来写映射文件,明白之后,速度会非常快。
多对一关联映射
映射原理
多的一端维护关联关系,在“多”的一端加入一个外键,指向“一”的一端。多的一端持有一的一端的引用,即在“多”的一端加外键,指向“一”的一端。
实例
比如,多个用户属于同一组,我们从对象模型和关系模型两个角度来分析一下这个例子,如下:
从上图可以看出,对象模型具有方向性,通过用户(User)可以看到组(Group),但是不能反过来。用户和组各对应一张数据库表,聚合关系需要一个外键(groupid)来表示,最后生成的表如下所示:
作用:
当我拿到用户时直接就可以拿到用户的组,hibernate在访问多的一端时,可以自动的加载关联对象。对于用户(User)来说,它的关联对象是组(group)。
上面都是多对一关联映射的基本原理,以及相应的实例,下面我们看一下代码:
代码
User类
public class User { private int id; private String name; private Group group; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Group getGroup() { return group; } public void setGroup(Group group) { this.group = group; } }
Group类
public class Group { private int id; private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; }
User.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="com.liang.hibernate"> <class name="User" table="t_user"> <id name="id"> <generator class="native"></generator> </id> <property name="name"></property> <!-- group属性,表达的是本对象与Group的多对一的关系--> <many-to-one name="group" class="Group" column="groupid"></many-to-one> <!-- 解释: 多对一关系标签: <many-to-one name=“” class=“” column=“”/> 1、第1个问号:group是User类的属性,对应于name属性名 2、第2个问号:class表达的是本对象(User)与Group的关系 3、第3个问号:column是属性名+Id 当我们写完注释之后,我们直接拷贝问号的对应关系即可。 --> </class> </hibernate-mapping>
Group.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> <class name="com.liang.hibernate.Group" table="t_group"> <id name="id"> <generator class="native"></generator> </id> <property name="name"></property> </class> </hibernate-mapping>
生成的表结构,与上面的分析的关系模型一样:
项目中,多对一关联映射是最常见的映射,但它是Hibernate的关联映射中最简单的一种映射关系。下篇博文,我们介绍一对一单向关联映射,谢谢关注。
相关推荐
6.配置商品到商品分类的多对一单向关联关系 7.配置会员到会员级别的多对一单向关联关系 8.配置会员到订单的一对多双向关联关系 9.配置会员到留言的一对多单向关联关系 10.配置管理员到留言的一对多单向关联关系 11....
在多对一的单向关联中,一个Group可以被多个User引用,而User仅知道其所属的Group。在Hibernate映射文件中,我们可以通过`many-to-one`标签来表示这种关系。而在一对多的单向关联中,一个Group包含多个User,但User...
12.4.5 多对一单向关联的annotation注解实现538 12.4.6 一对多双向关联的annotation注解实现540 12.4.7 一对多双向自身关联的annotation注解实现542 12.4.8 多对多单向关联的annotation注解实现543 12.4.9 多对多...
3. **关系映射**:Hibernate支持一对一、一对多、多对一和多对多等各种关系映射,通过配置文件中的many-to-one、one-to-many、many-to-many等标签实现。 4. **缓存机制**:包括一级缓存(内部缓存)和二级缓存。一级...
优化 Hibernate 的方法包括使用双向一对多关联,不使用单向一对多、灵活使用单向一对多关联、不用一对一,用多对一取代、配置对象缓存,不使用集合缓存、一对多集合使用 Bag,多对多集合使用 Set、继承类使用显式...
Hibernate支持多种关系映射,如一对一、一对多、多对一和多对多,通过配置文件中的`<many-to-one>`, `<one-to-many>`, `<many-to-many>`标签实现。 **四、Hibernate缓存机制** 1. 一级缓存(内部缓存):每个...
Hibernate支持四种关联关系:一对一(one-to-one)、一对多(one-to-many)、多对一(many-to-one)和多对多(many-to-many),这些关联关系允许对象模型和数据库模型之间的复杂映射。 4. Hibernate的缓存机制: ...
8. **一对多、多对一、一对一和多对多关系映射**:Hibernate支持四种主要的关联关系映射,包括单向和双向的关联,以及使用外键或代理键的实现方式。 9. **继承映射**:Hibernate支持类继承结构的映射,如单表继承、...
在处理一对多或多对多关联时,Hibernate可能会出现N+1查询问题。当从一个实体加载关联集合时,除了初始查询外,还会对每个关联项单独发起查询,导致性能下降。解决这个问题的一种常见方法是使用HQL或Criteria查询时...
- 主要有四种:一对一(one-to-one)、一对多(one-to-many)、多对一(many-to-one)和多对多(many-to-many)。 4. **Hibernate缓存机制**: - 一级缓存:每个Session内部的缓存,随Session关闭而清除。 - 二...
- 避免一对一关系,改为多对一,以减少冗余。 - 配置对象缓存,而非集合缓存,因为集合缓存可能导致数据一致性问题。 - 使用Bag(List)代表一对多关系,Set代表多对多关系,以确保唯一性。 - 使用显式多态处理...
Hibernate支持四种关联关系:一对一(one-to-one)、一对多(one-to-many)、多对一(many-to-one)和多对多(many-to-many)。 4. **Hibernate的缓存机制**: Hibernate有一级缓存和二级缓存。一级缓存是每个...
在Hibernate中,存在四种类之间的关联关系:一对一(one-to-one)、一对多(one-to-many)、多对多(many-to-many)和多对一(many-to-one)。这些关系映射为对象间的导航属性,允许对象间建立关联。 Hibernate的...
- 避免一对一,改用多对一。 - 配置对象缓存,减少集合缓存。 - 一对多集合使用Bag,多对多集合使用Set。 - 显式多态处理继承类。 - 减少表字段,增加表关联,利用二级缓存优化。 **Struts的工作机制及为什么使用**...
5. 关系映射:支持一对一、一对多、多对多等各种关系映射,便于处理复杂的数据库结构。 Hibernate 的延迟加载(Lazy Loading)允许对象在实际需要时才从数据库加载,提高性能。例如,实体对象和集合可以通过配置...
- **用多对一取代一对一**:可以减少不必要的关联。 - **配置对象缓存**:避免使用集合缓存。 - **使用Bag或Set**:根据不同情况选择合适的集合类型。 - **使用显式多态**:对于继承类来说,使用显式多态可以提高...
- 支持多种关系映射,包括一对一、一对多、多对多等。 **延迟加载(Lazy Loading)**是Hibernate的一个重要特性,分为实体对象和集合的延迟加载。在数据未被实际使用前,不会加载到内存中,节省资源。 **类间关系...
- **类间关系**:通过配置文件中的映射注解实现一对一、一对多、多对多等关系。 - **缓存机制**:包括一级缓存(Session级别的事务级缓存)和二级缓存(可选的进程或分布式缓存,如Ehcache)。 2. **Hibernate...
Hibernate支持多种关系映射,如一对一(OneToOne)、一对多(OneToMany)、多对一(ManyToOne)和多对多(ManyToMany)。这些关系可以通过配置文件中的注解或XML元素定义。 **Hibernate的缓存机制** 1. **一级缓存*...