一、单向的多对一
多对一的关系和关系型数据库中外键参照关系最匹配,在多方表中有一个外键,指向一方表的主键。
单向的多对一映射是我在项目中使用最多的一种配置。
实现:单向的多对一映射关系实现是由多方来维护的。在多方持有一方的引用,在多方的映射文件中配置<many-to-one>属性。
还以之前的学生和班级为基础来看一下具体实现:
说明一下:和单向的一对多一样,单向的多对一也只能通过多来导航到一,是单向的,可以通过学生来导航到班级进行相应的操作,并不能通过班级来导航到学生。
1.持久化类
Grade:
private int gid;
private String gname;
private String gdesc;
Students:需要注意,在Students持久化类中添加了对Grade的引用,并且提供了set/get
private int sid;
private String sname;
private Grade grade;
public Grade getGrade() {
return grade;
}
public void setGrade(Grade grade) {
this.grade = grade;
}
2.映射文件
在多方维护,所以Grade.hbm.xml并没有特别之处。
<hibernate-mapping>
<class name="com.iteye.sunyq.hibernate.Grade" table="grade">
<id name="gid" type="integer">
<column name="id"></column>
<generator class="native"></generator>
</id>
<property name="gname" type="string">
<column name="gname"></column>
</property>
<property name="gdesc" >
<column name="gdesc"></column>
</property>
</class>
</hibernate-mapping>
需要在Students.hbm.xml中添加对应外键的映射也就是<many-to-one>
<hibernate-mapping>
<class name="com.iteye.sunyq.hibernate.Students" table="students">
<id name="sid" type="integer">
<column name="id"></column>
<generator class="native"></generator>
</id>
<property name="sname" type="string">
<column name="sname"></column>
</property>
<many-to-one name="grade" class="com.iteye.sunyq.hibernate.Grade">
<column name="gid"></column>
</many-to-one>
</class>
</hibernate-mapping>
通过以上的配置就可以对这两个表进行操作了。
二、双向关联关系
实现:一方为one,一方为many,同时配置<many-to-one>和<set>来建立双向的关联关系。
通过双向的关联关系我们搭建了双向的导航,可以从学生导航到班级,也可以通过班级导航到
学生,只不过性能上需要通过配置来优化一下,下面会说。
还是基于学生和班级来说:
1.持久化类
Grade中保存Students的set集合
...
private int gid;
private String gname;
private String gdesc;
private Set<Students> studentSet = new HashSet<Students>();
...
Students中保存Grade的引用
private int sid;
private String sname;
private Grade grade;
2.映射文件
Grade.hbm.xml中配置Students的外键
<set name="studentSet" inverse="true">
<key column="gid"/><!-- Students表中外鍵名称 -->
<one-to-many class="com.iteye.sunyq.hibernate.Students"></one-to-many><!-- 映射的实体类 -->
</set>
同时需要在Grade.hbm.xml中配置映射关系
<many-to-one name="grade" class="com.iteye.sunyq.hibernate.Grade">
<column name="gid"></column>
</many-to-one>
3.测试类
Session session = HibernateUtil.getSession();
Transaction transaction = session.beginTransaction();
Grade g = new Grade("班级一", "班级一描述");
Students s1 = new Students("学生1");
Students s2 = new Students("学生1");
g.getStudentSet().add(s1);
g.getStudentSet().add(s2);
s1.setGrade(g);
s2.setGrade(g);
session.save(g);
session.save(s1);
session.save(s2);
transaction.commit();
HibernateUtil.closeSession(session);
相应的执行sql如下图:
注意:在这里需要注意一下,因为是双向的关联关系,除了正常的3个insert语句还有2个update更新语句,这是由于Grade中维护一对多关系时产生的。此时为了提高性能,可以在set标签中添加一个设置inverse="true",表明关联关系的维护由多方来维持。
<set name="studentSet" inverse="true">
<key column="gid"/><!-- Students表中外鍵名称 -->
<one-to-many class="com.iteye.sunyq.hibernate.Students"></one-to-many><!-- 映射的实体类 -->
</set>
之后再去测试一下,就没有多余的update语句了:
查询验证:
配置默认的是执行懒加载模式:就是现在学生与班级有多对一的关联关系,但是查询学生的时候不会默认查询相应班级的信息,当使用到班级信息的时候再去执行查询。
Session session = HibernateUtil.getSession();
Transaction transaction = session.beginTransaction();
Students s = (Students) session.get(Students.class, 2);
System.out.println(s.getSname());
transaction.commit();
session.close();
执行的sql:
Session session = HibernateUtil.getSession();
Transaction transaction = session.beginTransaction();
Students s = (Students) session.get(Students.class, 2);
System.out.println(s.getSname());
Grade g =s.getGrade();
System.out.println(g.getGname());
transaction.commit();
session.close();
执行的sql
从结果可以看出来,只有用到相关grade信息时,才去执行的select查询grade表:这个就叫做懒加载。
此时如果想要在获取到students信息的时候就已经获取到全部包含grade的信息时就需要在<many-to-one>中添加一个属性配置
<many-to-one name="grade" class="com.iteye.sunyq.hibernate.Grade" lazy="false">
<column name="gid"></column>
</many-to-one>
此时再次执行上面查询代码:
此时就是全部查询出来的。
这个属性的配置根据需求来定,因为涉及到一定的性能。
- 大小: 35.4 KB
- 大小: 36.6 KB
- 大小: 18.2 KB
- 大小: 28.7 KB
- 大小: 28 KB
分享到:
相关推荐
总之,Hibernate的多对多关联映射是解决复杂关系数据库设计的关键技术之一。通过合理的配置和使用,开发者可以轻松管理实体之间的多对多关系,提高开发效率。理解并熟练掌握这部分知识对于提升Java企业级应用开发...
本教程将带你入门Hibernate的多对多实体映射,帮助你理解如何通过源码来实现这种复杂的关系映射。 一、Hibernate概述 Hibernate是一个对象关系映射(ORM)框架,它允许我们将Java对象(实体)与数据库表进行映射,...
本文将深入探讨 Hibernate 中的一对一映射关系,并以"hibernate 映射关系学习入门 一对一映射Eclipse源码"为主题,详细解析其概念、配置以及实际应用。 一对一映射是Hibernate中的一种关联关系,它表示两个实体之间...
包含《多对多双向关联映射》《多对一单向关联映射》《多对一双向关联映射》《一对多单向关联映射》等文档,并有图解及例子,非常适合新手学习,尤其是刚刚接触hibernate,对映射关系不清楚的。。。。
1. Hibernate 是一种开源的持久层框架,提供了一个高效的数据访问机制,能够将 Java 对象与数据库表进行映射。 2. MyEclipse 是一个集成开发环境(IDE),提供了丰富的开发工具和插件,包括数据库管理、代码编辑、...
本文将深入探讨Hibernate中的一对多和多对一映射关系,并通过一个实际的demo演示它们在增删查改操作中的应用。 首先,我们要理解什么是数据库的关联关系。在数据库设计中,我们经常遇到一种情况,即一个实体可能与...
hibernate映射文件是Java开发中用于对象关系映射(ORM)的重要组成部分,它将数据库表与Java类之间的关系进行定义,使得开发者无需编写大量的SQL语句,就能实现对数据库的操作。`生成hibernate映射文件工具`是为了...
本教程将详细讲解如何使用Hibernate来实现MySQL数据库中的一对多和多对一的映射关系。 ### 一、Hibernate简介 Hibernate是一个开源的ORM框架,它通过XML配置文件或者注解将Java对象映射到关系数据库表,实现了对象...
在本章中,我们将深入探讨Hibernate中的关联映射,包括一对多、多对一以及多对多的关系。这些映射关系对于理解如何在Java应用程序中有效地管理数据库对象至关重要。 首先,我们来解决描述中提到的问题。`...
在这个“hibernate学习入门之一对多实体映射源码”教程中,我们将深入探讨如何在Hibernate中设置和管理一对多的关系。 一、Hibernate简介 Hibernate是Java开发人员用于处理数据库操作的强大工具,通过它,我们可以...
4. **关联(Associations)**:实体之间的关系,如一对一、一对多、多对多等。 5. **继承(Inheritance)**:支持类的继承结构,如单表继承或多表继承。 自动化的映射文件生成通常涉及以下步骤: 1. **分析Java类**...
**hibernate映射与查询** Hibernate 是一个流行的 Java 应用程序开发框架,它提供了一个持久层解决方案,简化了数据库操作。对于初学者来说,理解 Hibernate 的映射和查询机制是至关重要的,因为它们构成了 ...
本主题将深入探讨Hibernate中的一对多和多对一映射关系,这两种关系在实际的业务场景中非常常见。 首先,我们来理解一下一对多映射(One-to-Many Mapping)。在数据库设计中,一对多关系意味着一个父记录可以与多...
而MyEclipse作为一款强大的Java集成开发环境,提供了对Hibernate的良好支持,包括自动生成Hibernate映射文件的功能。本文将详细介绍如何在MyEclipse中创建和使用Hibernate映射文件。 首先,理解Hibernate映射文件...
- `<one-to-one>`、`<many-to-one>`、`<one-to-many>`和`<many-to-many>`:分别用于一对一、一对多、多对一和多对多的关系映射,通过`<class>`元素的嵌套和属性如`inverse`、`cascade`等来控制关系的维护方式和级联...
本主题聚焦于"hibernate单向多对多映射",特别是在XML配置文件中的实现。在这个过程中,我们将探讨多对多关系的原理,以及如何在Hibernate中通过XML配置文件来定义这种关系。 首先,我们需要理解多对多关系的概念。...
本篇文章将深入探讨Hibernate中的一对多和多对多关系映射。 首先,让我们理解一对多关联映射。在数据库中,一对多关系意味着一个表中的记录可以与另一个表中的多个记录相关联。在Hibernate中,这可以通过在实体类中...