`
zc9861692
  • 浏览: 5987 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
最近访客 更多访客>>
社区版块
存档分类
最新评论

Hibernate 表关系描述之ManyToMany

阅读更多

 上篇写了一对一,那么在这篇我们讲一对多,那么在表中的一对多,是使用外键关联,通过一张表的一个键另一个表的外键来建立一多关系;
 而在类中表示为一个类中有一个集合属性包含对方类的很多对象,而在另一个类中,只包含前术类的一个对象,从而实现一对多关系的建立!
 而在Hibernate中采用的是Set类型集合,而使用<one-to-many>主<many-to-one>来实现,好了,我们来看一下:
在上一篇中讲到一对多,那么在此补充一下多对多;
在数据库中也有多对多的关系,数据中的实现方式一般是采用存在多对多关系的两个对对象表,建立多对多关联表,也就是用一个独立的表来存入两个表的主键字段,通过遍历这张表来获取两表的关联关系。
而在我们的对象中,多对多是通过两者对象类中互相建立对方类的对象集合,类似上一篇讲到的一对多的集合类!
在Hibernate中当然就是通过<many to many>了
我们现在来通过一个案例来学习。学生与老师关系,是多对多。一个学生可以有多个老师,而一个老师也一样可以有多名学生!
Step1:首先建立我们需要的表,如下:

create   table  teachers
(
    teaID 
bigint  auto_increment  primary   key ,
    teaName 
varchar ( 20 )
);

create   table  students
(
    stuID 
bigint   primary   key  auto_increment,
    sName 
varchar ( 20 )
);

-- 关联表   学生与教师
create   table  student_teacher_table
(
    teaID 
int ,
    stuID 
int
);
Step2:新建一个HibernateManyToMany项目 ,并添加hibernate。
Step3:我们将前面创建的teachers 表和students表导向到Beans中,注意这里的关系表 student_teacher_table并不导出!因为我们数据做持久,持久的是对象,而不是关系, student_teacher_table表存放的是关系,所以我们不需要将 其导出,那么使用呢?接着看吧!
Step4:现在我们开始类对象关系的描述,我们先打开生成的Student.java 在里面添加Set 教师集合,然后在Teachers.java中同样添加Set学生集合!
Step5:我们描述了类与类之间的关系后,剩下的就是让Hibernate知道它们之间的关系,分别修改学生和教师类映射文件!
student.hbm.xml内容如下:
<? xml version="1.0" encoding="GBK" ?>
<! DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"
>
<!--  
   Autho:fengyan
   date: 2006-12-30 17:04
-->
< hibernate-mapping >
    
< class  name ="hibernate.beans.Students"  table ="students"  catalog ="study" >
        
< id  name ="stuId"  type ="java.lang.Long" >
            
< column  name ="stuID"   />
            
< generator  class ="native"   />
        
</ id >
        
< property  name ="sname"  type ="java.lang.String" >
            
< column  name ="sName"  length ="20"   />
        
</ property >
        
        
< set  name ="teachers"  table ="student_teacher_table"  cascade ="save-update"  inverse ="false" >
            
            
< key  column ="stuID" ></ key >
            
<!--
            它的控制主要是通过stuid来选择,就是我们从student_teacher_table表中我们只
            要select *  from student_teacher_table where  stuID='该学生ID',这样我
            们就可以获取它的教师的ID了
             
-->
         
             
< many-to-many  class ="hibernate.beans.Teachers"  column ="teaID" ></ many-to-many >
             
<!--  
             我们从student_teacher_table表中根据stuID拿到了与该stuID关联的teaID,
             然后 select * from teacher where teaID='前一步拿到的teaID' 
-->
        
</ set >
    
</ class >
</ hibernate-mapping >

再看teacher.hbm.xml文件内容:
<? xml version="1.0" encoding="GBK" ?>
<! DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"
>
<!--  
   Authod:fengyan
   date:  2006-12-30 17:10
-->
< hibernate-mapping >
    
< class  name ="hibernate.beans.Teachers"  table ="teachers"  catalog ="study" >
        
< id  name ="teaId"  type ="java.lang.Long" >
            
< column  name ="teaID"   />
            
< generator  class ="native"   />
        
</ id >
        
< property  name ="teaName"  type ="java.lang.String" >
            
< column  name ="teaName"  length ="20"   />
        
</ property >
        
        
<!--  前面在student中已经级联了,所以这里我没有再级联,简单的演示!  -->
        
< set  name ="students"  table ="student_teacher_table"  inverse ="true" >
            
< key  column ="teaID" ></ key >
            
< many-to-many  class ="hibernate.beans.Students"  column ="stuID" ></ many-to-many >
        
</ set >
    
</ class >
</ hibernate-mapping >

然后我们现在建立一个StudentDAO.java用来封装操作:
StudentDAO.java
package  hibernateDAOS;
/** */ /**
 * Authod:fengyan
 * date:   2006-12-30 17:15    
 
*/

import  hibernate.HibernateSessionFactory;
import  hibernate.beans.Students;

import  org.hibernate.Session;
import  org.hibernate.Transaction;

public   class  StudentsDAO  {
    
public   void  save(Students student)
    
{
        Session session 
=  HibernateSessionFactory.getSession();        
        Transaction tx 
=  session.beginTransaction();
        
try
        
{
            session.save(student);
            tx.commit();
        }

        
catch (Exception e)
        
{
            System.out.println(
" stuDAO has errors: " + e);
            tx.rollback();
        }

        
finally
        
{
            session.close();
        }

    }


}

Step6:建立一个Servlet,MyServlet.java;
MyServlet.java
package  hibernate.servlet;

import  hibernate.beans.Students;
import  hibernate.beans.Teachers;
import  hibernateDAOS.StudentsDAO;

import  java.io.IOException;

import  javax.servlet.ServletException;
import  javax.servlet.http.HttpServlet;
import  javax.servlet.http.HttpServletRequest;
import  javax.servlet.http.HttpServletResponse;

public   class  MyServlet  extends  HttpServlet  {


    
public   void  doGet(HttpServletRequest request, HttpServletResponse response)
            
throws  ServletException, IOException  {
        
        
// 产生学生
        Students s1  =   new  Students( " 学生1 " );
        Students s2 
=   new  Students( " 学生2 " );
        
        
// 产生教师
        Teachers t1  =   new  Teachers( " 教师1 " );
        Teachers t2 
=   new  Teachers( " 教师2 " );
        Teachers t3 
=   new  Teachers( " 教师3 " );
        Teachers t4 
=   new  Teachers( " 教师4 " );
        
        
// 学生关联教师(学生选择教师)
        s1.getTeachers().add(t1);
        s1.getTeachers().add(t2);
        
// 学生 s1 选择 t1 及 t2 二名教师

        s2.getTeachers().add(t1);
        s2.getTeachers().add(t3);
        
// 学生 s2 选择 t1 及 t3 二名教师
        
        
// 我们保存学生 s1及 s2
        StudentsDAO sd  =   new  StudentsDAO();
        sd.save(s1);
        sd.save(s2);
    }

}

Step7:最后来个测试index.jsp页面
< href ="servlet/MyServlet" > add  </ a >

运行 结果:



由图片可知,
第一步:首先将 “学生1”插入students表中;
第二步:将"学生1"关联的“教师1”插入到teachers表中;
第三步:将“学生1”关联的“教师2”插入到teachers表中;
第四步:将“学生1”与“教师1”的关联信息(1,1)插入到student_teacher_table表中;
第五步:将“学生1”与“教师2”的关联信息(1,2)插入到student_teacher_table表中;
第六步:将“学生2”插入students表中;
第七步:将“教师3”插入teachers表中;
第八步:更新?更新了“学生2”关联~这步有点不解
第九步:将“学生2”与“教师1”的关联信息(2,1)插入到student_teacher_table表中;
第十步:将“学生2”与“教师3”的关联信息(2,3)插入student_teacher_table表中;

总结:感觉多对多与一对多基本是差不多的~至于每次示例中仅仅是简单的save,,而没其它的操作,是由于打算以后将在SSH项目中运用!

分享到:
评论

相关推荐

    manytomany注解模式.rar

    这种关系在数据库表设计中通常通过中间表来实现,而在Hibernate中,我们使用`@ManyToMany`注解简化了这种复杂性。 标题"manytomany注解模式.rar"表明这个压缩包文件包含了关于如何在Hibernate中使用`@ManyToMany`...

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

    在Hibernate中,多对多关系通过中间表(也称为联接表或关联表)来实现,这个表包含来自两个表的外键。 三、配置多对多映射 在Hibernate中,配置多对多映射通常需要以下几个步骤: 1. **实体类定义**:为每个实体...

    Hibernate映射关系配置:XML方式和注解方式

    4. **关系映射**:注解如`@ManyToOne`, `@OneToMany`, `@OneToOne`, `@ManyToMany`等,它们在实体类的属性上声明,描述实体间的关联关系。 **标签解析** "源码"和"工具"这两个标签暗示了讨论可能涉及实际代码示例...

    Hibernate ORM - 多对多双向连接表关联关系

    本文将深入探讨Hibernate ORM中的一个关键概念——多对多双向连接表关联关系。这种关联关系在实际业务场景中非常常见,比如用户与角色、课程与学生等例子,都需要用到多对多的关系来描述它们之间的复杂联系。 首先...

    用Hibernate映射继承关系

    使用`@ManyToMany`注解,通常还需要一个中间表(或称为关联表)来存储两个实体的关联关系。 理解并熟练运用这些映射关系,能帮助我们更好地设计和实现Java应用的数据层,提高开发效率,同时保持数据模型的灵活性和...

    hibernate E-R模型关系配置

    在Java开发领域,Hibernate是一个非常流行的Object-Relational Mapping(ORM)框架,它允许开发者将Java对象映射到关系数据库的表中,从而简化了数据库操作。本话题将深入探讨如何利用Hibernate配置E-R(实体-关系)...

    hibernate annotation hibernate3

    Hibernate 3中的注解机制使得开发者能够更直观地在Java类中描述数据库模型,减少了XML配置文件的使用,提升了开发效率。通过熟练掌握这些注解,开发者可以更好地运用Hibernate进行数据持久化操作,实现高效、灵活的...

    Hibernate关系映射

    Hibernate关系映射是Java开发中一种重要的对象关系映射(ORM)技术,它允许开发者用面向对象的方式处理数据库操作,极大地提高了开发效率。本篇将深入探讨Hibernate关系映射的核心概念、配置和常见实践,以帮助你更...

    struts2+hibernate+spring多表操作示例

    通过以上描述,我们可以看到Struts2、Hibernate和Spring在多表操作中的协同工作,使得开发者可以更加专注于业务逻辑,而不是底层的数据库操作。理解并熟练掌握这三大框架的集成,对于Java Web开发人员来说至关重要。

    Hibernate教程14_关系映射之多对多双向关联

    标题"Hibernate教程14_关系映射之多对多双向关联"暗示我们将探讨如何在Hibernate中设置两个实体之间的双向多对多关联。双向意味着在两个实体类中,都可以直接访问到对方的集合。 在描述中提到的链接是一个CSDN博客...

    hibernate关系映射

    以下是关于“Hibernate关系映射”的详细解释。 1. 一对一关系映射: Hibernate支持一对一(One-to-One)关系映射,这种关系通常存在于具有唯一性的关联表中。通过在实体类中使用`@OneToOne`注解,我们可以定义一对...

    Hibernate面试题专栏 - 最全的Hibernate面试题, Hibernate笔试题, Hibernate问题

    【标题】与【描述】提及的是“Hibernate面试题专栏”,主要涵盖了全面的Hibernate面试题、笔试题以及相关问题,这表明我们将要讨论的是Java领域中著名的对象关系映射框架——Hibernate的相关知识。Hibernate是一个...

    Hibernate_code

    Hibernate提供了不同的集合映射方式,如@OneToMany、@ManyToOne、@ManyToMany等,用于描述这些关系。 5. **Hibernate_Component**:这部分可能包含了Hibernate组件映射的示例。组件是对象的一部分,可以被嵌入到...

    Hibernate教程19_关系映射案例二

    【描述】提到的链接是一个CSDN博客文章,详细介绍了某个Hibernate关系映射的实例。根据描述,我们可以推测这个教程可能涉及了如何通过Hibernate配置和代码实现数据库表之间的关联,例如一对一、一对多、多对一或多对...

    Hibernate多对多实例+数据库代码

    描述中提到"附带了数据库代码",意味着我们将看到不仅限于Hibernate的Java代码,还有与之配合的SQL脚本,以便在数据库层面理解这种关联。 **Hibernate简介** Hibernate是一个强大的开源对象关系映射(ORM)框架,...

    hibernate源码 直接使用

    描述中的"包括一对一 一对多 和多对多"提到了Hibernate中三种常见的关联关系映射。一对一(One-to-One)、一对多(One-to-Many)和多对多(Many-to-Many)是实体间的关系类型,它们在数据库设计中广泛存在,并且...

    eclipse项目Hibernate实例

    3. **实体类设计**:学习如何创建表示数据库表的Java类,使用Hibernate的注解(如@Entity、@Table、@Id等)来定义对象-关系映射。 4. **映射文件**:虽然使用注解可以简化映射,但理解`.hbm.xml`文件的结构也很重要...

    Hibernate distribution and annotation

    2. **映射机制**: Hibernate支持XML映射文件(hbm.xml)和注解映射两种方式,让对象与数据库表之间建立映射关系。 3. **Session和Transaction**: Session是Hibernate的主要工作单元,负责保存、更新和检索对象。...

    Hibernate完整ppt教程

    - Hibernate是Java领域中最流行的ORM框架之一,它提供了一种在Java对象和数据库表之间进行自动映射的方法。 2. **Hibernate架构** - Hibernate由多个组件构成,如Configuration、SessionFactory、Session、...

    hibernate3实例包

    1. **对象关系映射(ORM)**:Hibernate是ORM框架的代表,它在对象模型和关系数据库之间建立桥梁,通过将Java类映射到数据库表,使开发者能够以面向对象的方式处理数据库事务。 2. **配置文件**:在Hibernate 3中,...

Global site tag (gtag.js) - Google Analytics