Hibernate的关联映射之N-N关联映射 .

四、N—N关联关系

1.1单向N-N的关联

单向的N-N关联和1-N关联的持久化类完全一样,控制关系的一端需要增加一个set集合属性,被关联的持久化实例以集合的形式存在。

N-N关联必须使用连接表,N-N关联与有连接表的1-N关联非常相似,只需要去掉<many-to-many.../>元素的unique="true"即可。其他的配置和1-N关联一样。

由于与1-N关联非常相似,这里就不演示了。

1.2双向N-N的关联

对于双向的N-N关联,我们只需要转换为两个1-N关联模型即可。双向N-N关联两端都需要使用set集合属性,两端都增加对集合属性的访问。双向N-N同样必须使用连接表来建立两个实体之间的关联关系。

以学生、老师为例:下面为两个实体的持久化类:

Student

[java] view
plain
 copy

print?

  1. public class Student {
  2. private Integer id;
  3. private String name;
  4. private Set<Teacher> teachers;
  5. public Integer getId() {
  6. return id;
  7. }
  8. public void setId(Integer id) {
  9. this.id = id;
  10. }
  11. public String getName() {
  12. return name;
  13. }
  14. public void setName(String name) {
  15. this.name = name;
  16. }
  17. public Set<Teacher> getTeachers() {
  18. return teachers;
  19. }
  20. public void setTeachers(Set<Teacher> teachers) {
  21. this.teachers = teachers;
  22. }
  23. }

Teacher

[java] view
plain
 copy

print?

  1. public class Teacher {
  2. private Integer id;
  3. private String name;
  4. private Set<Student> students;
  5. public Integer getId() {
  6. return id;
  7. }
  8. public void setId(Integer id) {
  9. this.id = id;
  10. }
  11. public String getName() {
  12. return name;
  13. }
  14. public void setName(String name) {
  15. this.name = name;
  16. }
  17. public Set<Student> getStudents() {
  18. return students;
  19. }
  20. public void setStudents(Set<Student> students) {
  21. this.students = students;
  22. }
  23. }

双向N-N关联的映射文件需要使用<set.../>元素,用以映射集合属性。<set.../>属性还需要增加<key.../>子元素来映射外键列,同时还应该增加<many-to-many.../>子元素来映射关联实体类。两个映射文件如下:

Student.hbm.xml

[html] view
plain
 copy

print?

  1. <hibernate-mapping package="com.hibernate.domain">
  2. <class name="Student" table="student">
  3. <id name="id" column="student_id">
  4. <generator class="native" />
  5. </id>
  6. <property name="name" column="student_name" />
  7. <!-- 映射N-N关联实体,两边的table应该以样 -->
  8. <set name="teachers" table="student_teacher">
  9. <!-- 映射关联的外键 列-->
  10. <key column="student_id" />
  11. <!-- 映射关联类属性 -->
  12. <many-to-many class="Teacher" column="teacher_id" />
  13. </set>
  14. </class>
  15. </hibernate-mapping>

Teacher.hbm.xml

[html] view
plain
 copy

print?

  1. <hibernate-mapping package="com.hibernate.domain">
  2. <class name="Teacher" table="teacher">
  3. <id name="id" column="teacher_id">
  4. <generator class="native" />
  5. </id>
  6. <property name="name" column="teacher_name" />
  7. <!-- 映射N-N关联实体,两边的table应该以样 -->
  8. <set name="students" table="student_teacher">
  9. <!-- 映射关联的外键 列-->
  10. <key column="teacher_id" />
  11. <!-- 映射关联类属性 -->
  12. <many-to-many class="Student" column="student_id"></many-to-many>
  13. </set>
  14. </class>
  15. </hibernate-mapping>

双向N-N关联的双边都需要指定连接表的表名,外键列的列名,所以两个<set.../>元素的table属性的值必须指定且一样。<set.../>元素的两个子元素:<key../>、<many-to-many.../>都必须指定column属性。<key.../>和<many-to-many.../>分别是指定本持久化类、关联类在连接表中的外键列。因此两边的<key.../>和<many-to-many.../>的column属性的值应该是交叉相等。

通过下面的操作类来添加两个Student对象和两个Teacher对象

[java] view
plain
 copy

print?

  1. static void add(){
  2. Session session = HibernateUtil.getSession();
  3. Transaction tx = session.beginTransaction();
  4. Teacher teacher1 = new Teacher();
  5. teacher1.setName("teacher1");
  6. Teacher teacher2 = new Teacher();
  7. teacher2.setName("teacher2");
  8. Student student1 = new Student();
  9. student1.setName("student1");
  10. Student student2 = new Student();
  11. student2.setName("student2");
  12. //建立两者之间的关系
  13. Set<Student> ss = new HashSet<Student>();
  14. ss.add(student1);
  15. ss.add(student2);
  16. teacher1.setStudents(ss);
  17. teacher2.setStudents(ss);
  18. session.save(teacher1);
  19. session.save(teacher2);
  20. session.save(student1);
  21. session.save(student2);
  22. tx.commit();
  23. session.close();
  24. }

注意:这里只能由一边建立关联关系,就是说只能由Student对象建立与Teacher对象的关联或者由Teachert对象建立与Student对象的关联。否则将会出现主键重复错误

时间: 2024-10-19 17:29:52

Hibernate的关联映射之N-N关联映射 .的相关文章

Hibernate的七种映射关系之七种关联映射(二)

继续上篇博客 七.Hibernate双向一对多关联映射:让多的一端来维护关系. 主要是解决一对多单向关联的缺陷,而不是需求驱动的. 1.在Student.java实体类里添加Classes引用.private Classes classes; 2.Student.hbm.xml里添加many-to-one标签:<many-to-one name="classes" column="classesid"/>.Classes.hbm.xml在例子(六)里的那

Hibernate的七种映射关系之七种关联映射(一)

关联映射就是将关联关系映射到数据库里,在对象模型中就是一个或多个引用. 一.Hibernate多对一关联映射:就是在"多"的一端加外键,指向"一"的一端. 比如多个学生对应一个班级,多个用户对应一个级别等等,都是多对一关系. 1."多"端实体加入引用"一"端实体的变量及getter,setter方法. 比如说多个学生对应一个班级,在学生实体类加入:private Grade grade; 2."多"端配置文

一口一口吃掉Hibernate(五)——一对多单向关联映射

版权声明:本文为博主原创文章,未经博主允许不得转载.如需转载请声明:[转自 http://blog.csdn.net/xiaoxian8023 ] 在上一篇博客<一口一口吃掉Hibernate(四)--多对一单向关联映射>中,介绍了多对一的关联映射,今天就反过来说一下一对多的单向关联映射. 可能有人会对这2篇博客的题目有点混淆不清,跟日常说的关系有点不同.我们日常说的比如父子关系,夫妻关系都是说的双向关系,而现在讨论的则是单向关系,所以也就有了多对一和一对多的说法. 二者的关系其实很简单,只是

HIbernate学习笔记4 之 延迟加载和 关联映射

一.延迟加载 * 在使用hibernate一些方法的查询数据的时候,返回的只是一个空对象(除id外属性都为NULL),并没有真正的查询数据库,而是在使用这个对象时才会触发查询数据库,并将这些数据注入到这个空对象中.这种将查询实际推迟到对象访问的机制就称为 延迟加载. *好处: 可以提升内存资源的使用率,降低对数据库的访问次数. *方法: session.load()   /  query.iterate()  / 关联映射中对关联属性的加载 *注意问题:避免在使用对象之前,提前关闭session

hibernate之关于一对一单向,双向关联映射

[hibernate]之关于一对一单向,双向关联映射 首先我们来看,Hibernate官方对于一对一单向关联的解释: 基于外键关联的单向一对一关联和单向多对一关联几乎是一样的.唯一的不同就是单向一对一关 联中的外键字段具有唯一性约束. ok,那我们也可以这样理解,一对一其实就是多对一关联的特殊形式,我们知道Hibernate的配置方式有两种,分别是Annotations,XML两种配置方式! Annotations的一对一单向关联映射 人(User)和***号(Card) @Entity @Ta

Hibernate ORM框架——续第二章:Hibernate映射关系:单向关联

一:课堂笔记 **********单表映射*************** 1.只有一个实体类映射一个表 2.有一个实体类+ 一个或者多个值类型,合在一起 映射为一个表 **********多表映射*************** 定义:类有多个映射为多个表 **********数据库层面,如ORM无关************** 2个表之间要建立关系?该如何做?有多少种方法 假定有2个表,分别为A,B 3种关系 a)主键关联:A表的主键对应B表的主键,(一对一的关系) 在数据库种如何建立这种关系?

【SSH进阶之路】Hibernate映射——多对一单向关联映射(四)

[SSH进阶之路]Hibernate基本原理(一) ,小编介绍了Hibernate的基本原理以及它的核心,采用对象化的思维操作关系型数据库. [SSH进阶之路]Hibernate搭建开发环境+简单实例(二),小编搭建了基本Hibernate的开发环境,并做了一个简单实例,对它的基本原理有了一个理性的认识. [SSH进阶之路]Hibernate基本映射(三),我们介绍了Hibernate的基本映射(即对一个实体进行映射)的相关概念,并给大家实现相关实例,比较简单. 这篇博客,我们开始介绍基于基本映

Hibernate中用注解配置一对多双向关联和多对一单向关联

Hibernate中用注解配置一对多双向关联和多对一单向关联 Hibernate提供了Hibernate Annotations扩展包,使用注解完成映射.在Hibernate3.3之前,需单独下载注解开发包 配置持久化类 配置关联关系 下面我们先从多对一单向关联关系讲起,多对一单向关联就是在多的一方植入一的一方的主键作为外键,下面我们先进行初始配置, 在配置的过程中我们会遇到一个问题  就是无论用load还是get都不会出现延迟加载,那么我们应该如何设置为要延迟加载,这样做的好处是可以在用的时候

Hibernate映射(一)——基本映射

对象关系映射(ORM)的基本认识在之前的两篇博客中已有体现了. ORM基础认识 浅谈ORM的映射方案 今天来学习的是Hibernate的对象关系映射. Hibernate的几种映射方式 基本映射 Hibernate中映射的配置在XML中,我们要对object和table进行映射转换,只需要配置XML即可,所以学会使用Hibernate,重点也就在配置文件中的配置. 首先我们从基本映射开始,如下例: 1.User实体类: import java.util.Date; public class Us

Hibernate映射(一)—基本映射

对象关系映射(ORM)已经在前面的博文中介绍了:ORM介绍 本篇博文主要来介绍Hibernate的基本映射 概念 关系:事物之间相互作用.相互联系的状态 关联:将对象(数据库表)之间通过某种方式联系起来 映射:将一种形式转化为另一种形式 基本映射:表与表之间没有任何联系(系统中的字典表) Hibernate提供了几种映射方式 Hibernate基本组件 映射类(User.java):它是描述数据库表的结构,表中的字段被描述成属性,将来就可以实现把表中的记录映射成为该类的对象 映射文件(User.