`
neeleon
  • 浏览: 183472 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

hibernate入门(七)关联关系讨论_多对多关系映射

阅读更多

典型实例:一个学生可以有多个老师,同样一个老师可以有多个学生,对此设计如下:

学生studnet 表:

column

id

name

teachers

老师teacher 表:

column

id

name

studnets

在利用学生查到他所有的老师,我们一般会设计中间表,来查找,中间表用来把学生和老师关联,通过此表进行学生和老师之间的交互查找。

中间表teacher_student:

column

teacher_id

studnet_id

 

            复合主键

在数据库操作中,作以下说明:如果通过老师查找学生,过程:先通过teacher 表查找到id ,再到teacher_student 表中以teacher.id==teacher_student.teacher_id 为查询条件来查找studnent_id , 查找到studnet_id 后,再以teacher_student.stucent_id==student.id 为查询条件来查找所有学生的信息。 同样通过学生查老师,也是类似的过程。

>> 步骤一 、创建实体类StudentTeacher

Student 类内容如下:省略getXXX()setXXX() 方法。

package com.asm.hibernate.domain;

import java.util.Set;

public class Student {

    private int id ;

    private String name ;

    private Set<Teacher> teachers ;

}

Teacher 类内容如下:省略getXXX()setXXX() 方法。

package com.asm.hibernate.domain;

import java.util.Set;

public class Teacher {

    private int id ;

    private String name ;

    private Set<Student> students ;

}

>> 步骤二 、为两个实体创建配置文件(省略了前面的xml 文档声明内容):

Student.hbm.xml 内容如下:

< hibernate-mapping

    package = "com.asm.hibernate.domain" >

    < class name = "Student" >

       < id name = "id" >

           < generator class = "native" />

       </ id >

       < property name = "name" ></ property >

       < set name = "teachers" table = "teacher_student" >

           < key column = "student_id" />

           < many-to-many class = "Student" column = "teacher_id" />

       </ set >

    </ class >

</ hibernate-mapping >

说明: 这里重点说明最后的<set> 配置:(1StudentSet 类型的属性配置一个<set> 元素,其实在前面的一对多中已经出现了<set> 元素的配置,我们可以这样认为“凡是要为某个Set 类型的属性进行映射配置,都可以用<set> 元素来配置”。 <set> 中的table 属性为关联表的名称。 (2 )它的子元素<key> 中的column 为关联表中以该映射文件所映射的表的主键为外键的字段名称. 3<many-to-many> coumn 属性为关联表中以欲关联类对应表的主键为外键的字段名称。

Teacher.hbm.xml 内容如下:

< hibernate-mapping

    package = "com.asm.hibernate.domain" >

    < class name = "Teacher" >

       < id name = "id" >

           < generator class = "native" />

       </ id >

       < property name = "name" ></ property >

      

       < set name = "students" table = "teacher_student" >

           < key column = "teacher_id" />

           < many-to-many class = "Student" column = "student_id" />

       </ set >

    </ class >

</ hibernate-mapping >

由于和Student.hbm.xml 是类似的,这里不作说明,这样也就建立起了双向的多对多关联。

要注意他们所依赖的中间表为teacher_student ,所以这里的<set> 元素中的table 属性和teacher 映射文件相同,而特别要注意<key><many-to-many>column 中属性值的设定。

>> 步骤三 、在主配置文件中关联实体配置文件:只需要增加如下内容:

< mapping resource = "com/asm/hibernate/domain/Teacher.hbm.xml" />

< mapping resource = "com/asm/hibernate/domain/Student.hbm.xml" />

>> 步骤四 、编写测试文件ManyToManyTest.java :省略导入的包。

package com.asm.hibernate.test;

public class ManyToManyTest {

    public static void main(String[] args) {

       add ();

    }

 

    static void add() {

       Session s = null ;

       Transaction tr = null ;

       try {

           s = HibernateUtil.getSession ();

           tr = s.beginTransaction();

 

           Teacher t1 = new Teacher();

           t1.setName( "t1Name" );

 

           Teacher t2 = new Teacher();

           t2.setName( "t2Name" );

 

           Student s1 = new Student();

           s1.setName( "s1Name" );

 

           Student s2 = new Student();

           s2.setName( "s2Name" );

 

           // 再增加如下内容进行测试:

           Set<Teacher> ts = new HashSet<Teacher>();

           ts.add(t1);

           ts.add(t2);

           Set<Student> ss = new HashSet<Student>();

           ss.add(s1);

           ss.add(s2);

 

           t1.setStudents(ss);

           t2.setStudents(ss);

 

           // s1.setTeachers(ts);

           // s2.setTeachers(ts);

           // 增加内容完

           s.save(s1);

           s.save(s2);

           s.save(t1);

           s.save(t2);

           tr.commit();

 

       } finally {

           if (s != null )

              s.close();

       }

    }

}

说明:注意以上注释掉的内容,如果去掉会出现异常。理解:加上增加的内容后再执行发现,在开启“数据库显示”功能后,发现控制台中新增加了四条插入语句,且是插入到中间表teacher_student 中,在此处相当于告诉了每个学生所关联到的老师,而如果在mysql 客户端执行“show create table teacher_student, 观察它的表结构并结合“去掉注释的报错说明”,就容易理解到为什么不能有注释掉的内容。 另需要说明的是“多对多”在操作和性能方面都不太理想,所以它使用较少,一般我们会选择转换成“一对多”的模型,而Hiberante 的“多对多”实现,可能也是转换成两个“一对多”来实现。

分享到:
评论

相关推荐

    hibernate 映射关系学习入门 多对多实体映射

    本教程将带你入门Hibernate的多对多实体映射,帮助你理解如何通过源码来实现这种复杂的关系映射。 一、Hibernate概述 Hibernate是一个对象关系映射(ORM)框架,它允许我们将Java对象(实体)与数据库表进行映射,...

    hibernate 映射关系学习入门 一对一映射

    本文将深入探讨 Hibernate 中的一对一映射关系,并以"hibernate 映射关系学习入门 一对一映射Eclipse源码"为主题,详细解析其概念、配置以及实际应用。 一对一映射是Hibernate中的一种关联关系,它表示两个实体之间...

    hibernate学习入门一对多实体映射源码

    在这个“hibernate学习入门之一对多实体映射源码”教程中,我们将深入探讨如何在Hibernate中设置和管理一对多的关系。 一、Hibernate简介 Hibernate是Java开发人员用于处理数据库操作的强大工具,通过它,我们可以...

    hibernate_one_to_one映射简单入门例子

    `hibernate_one_to_one`标签表示我们将探讨的是如何在Hibernate中实现一对一的映射关系。 **二、一对一映射的两种类型** 1. **主键关联(Primary Key Join)**:两个实体共享同一个主键,这通常意味着它们是同一个...

    传智播客李勇hibernate源码1-20课

    14_多对一关联关系的映射与原理分析 15_多对一关联关系的检索与原理分析 16_保存多对一关联关系的更进一步分析 17_一对多关联关系的映射与原理分析 18_一对一主键关联关系的映射与原理分析 19_一对一主键关联...

    hibernate-tutorials_java_hibernate_Eclipse_fallenweg_

    本教程将详细介绍如何使用`@Entity`、`@Table`、`@Id`等注解,以及如何进行一对一、一对多、多对多等关联映射。 9. **查询语言(HQL)与 Criteria API** Hibernate提供了自己的查询语言HQL(Hibernate Query ...

    Hibernate入门案例源码

    【Hibernate入门案例源码】是针对初学者设计的一份教程,旨在帮助理解并掌握Java持久化框架Hibernate的基础应用。Hibernate是一个强大的ORM(对象关系映射)框架,它简化了数据库与Java对象之间的交互,使开发者可以...

    Hibernate入门(代码+笔记)

    **Hibernate入门** Hibernate是一款强大的Java持久化框架,它简化了数据库与Java对象之间的交互,使得开发者无需编写大量的SQL语句,就能实现数据的增删改查。本教程将分为五个部分,逐步深入Hibernate的世界。 **...

    Hibernate 对象关系映射

    本人在厦门邦初培训时候用的ppt 快速入门文档 内容: 建立一对多的关联关系域模型 建立一对多的参照关系的模型 映射一对多关联关系 通过hibernateAPI级联操作关联对象 其它关系的映射:一对一,多对多

    hibernate入门小例子

    【hibernate入门小例子】是一个适合初学者的教程,主要涵盖了如何在JavaWeb项目中使用Hibernate框架与MySQL数据库进行集成。在这个例子中,我们将会深入理解Hibernate的核心概念,包括实体映射、对象关系映射(ORM)...

    hibernate入门--第一个实例

    在这个“hibernate入门--第一个实例”中,我们将了解如何设置Hibernate环境,创建实体类,配置映射文件,以及执行基本的CRUD(创建、读取、更新和删除)操作。 1. **环境搭建** - **下载与安装**: 首先,你需要从...

    02_传智播客hibernate教程_hibernate入门案例的细节分析

    10. **关联映射**:一對一、一对多、多对一、多对多的关系映射实现,包括@OneToOne、@OneToMany、@ManyToOne、@ManyToMany等。 11. **缓存机制**:理解Hibernate的第一级缓存(Session级别)和第二级缓存...

    Hibernate入门到精通

    《Hibernate入门到精通》 Hibernate 是一款强大的Java持久层框架,它简化了数据库与Java对象之间的交互,使得开发者能够更加专注于业务逻辑的实现。本文将深入探讨Hibernate的基础知识,包括各种关联映射、继承映射...

    hibernate入门简单实例

    15. **实体关系映射策略**:包括一对一(OneToOne)、一对多(OneToMany)、多对一(ManyToOne)、多对多(ManyToMany)等,理解这些关系并正确配置是使用Hibernate的关键。 通过这个"hibernate_first"实例,你可以...

    Hibernate_3.2.0_Reference_zh_CN

    八、关联映射 1. 一对一(OneToOne):一个实体对象对应数据库中的一个记录。 2. 一对多(OneToMany):一个实体对象可以对应多个子对象,如学生与课程的关系。 3. 多对一(ManyToOne):多个实体对象对应一个父对象...

    hibernate入门与概述

    - **关联关系**:关联关系是对象之间的一种联系,比如一个班级可以有多个学生,这种关系在ORM中可以通过一对一、一对多、多对一、多对多等方式实现。 - **依赖关系**:对象之间的短暂交互,如函数调用,不涉及长期...

    Hibernate从入门到精通(六)一对一双向关联映射 - 赵帅 廊坊师范学院信息技术提高班

    Hibernate从入门到精通(六)一对一双向关联映射 - 赵帅 廊坊师范学院信息技术提高班

    hibernate入门

    Hibernate 是一个开源的对象关系映射(ORM)框架,它允许Java开发者在Java应用程序中操作数据库,而无需直接编写SQL语句。ORM框架如Hibernate简化了数据持久化的过程,通过将对象模型与数据库模型进行映射,实现了...

    Hibernate开发指南___夏昕

    “Hibernate高级特性”章节则进一步探讨了XDoclet与Hibernate映射、数据检索(包括CriteriaQuery和HQL)、数据关联(如一对一、一对多、多对多关系处理)、数据访问(PO和VO的使用)、事务管理、锁机制、分页、缓存...

Global site tag (gtag.js) - Google Analytics