在hibernate中也有多对多的关系。但是这样关系执行的效率不高,所以我们可以通过两个多对1或者两个1对多来实现。

在现实生活中多对多的关系也比较常见。比如说老师和学生。一个老师有多个学生,一个学生也有多个老师。

如何实现老师和学生的关系我们可以建立一个中间表。中间表的作用就是关联老师和学生用的。

大家请看这个表:

这个3个表就是这种关系。现在我来写一个实例来实现以上的关系。

1teacher类

package com.fish.testdao;

import java.util.Set;

public class Teacher {

private  int id;

private String name;

Set<Student> students;

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 Set<Student> getStudents() {

return students;

}

public void setStudents(Set<Student> students) {

this.students = students;

}

}

2student类

package com.fish.testdao;

import java.util.Set;

public class Student {

private int id;

private String name;

Set<Teacher> teachers;

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 Set<Teacher> getTeachers() {

return teachers;

}

public void setTeachers(Set<Teacher> teachers) {

this.teachers = teachers;

}

}

3.学生xml

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE hibernate-mapping PUBLIC

"-//Hibernate/HibernateMapping DTD 3.0//EN"

"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>

<class name="com.fish.testdao.Student">

<id name="id" type="integer">

<generator class="increment"></generator>

</id>

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

<set name="teachers" table="teacher_student">//我们会产生一个老师学生关联表

<key column="student_id"></key>//然后我们会在这个表中产生一个student_id的字段

<many-to-many class="com.fish.testdao.Teacher"column="teacher_id"></many-to-many>

</set>

</class>

</hibernate-mapping>

*注set就是用来做中间表的关联的。其实这个在一个表中有就可以了。这个set可以在techer的xml省去。当然写上也不会有错。

4.techer的xml

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE hibernate-mapping PUBLIC

"-//Hibernate/HibernateMapping DTD 3.0//EN"

"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>

<class name="com.fish.testdao.Teacher">

<id name="id" type="integer">

<generator class="increment"></generator>

</id>

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

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

<key column="teacher_id"></key>

<many-to-many class="com.fish.testdao.Student"column="student_id"   />

</set>

</class>

</hibernate-mapping>

5.我们写一个测试方法。

packagecom.fish.domain;

importjava.util.HashSet;

import java.util.List;

import java.util.Set;

importorg.hibernate.Query;

importorg.hibernate.Session;

importorg.hibernate.SessionFactory;

importorg.hibernate.Transaction;

import org.hibernate.cfg.Configuration;

importcom.fish.testdao.Student;

importcom.fish.testdao.Teacher;

public class Test4 {

public static Session getMySession() {

Configuration configuration = new Configuration();

configuration.configure("hibernate.cfg.xml");

SessionFactory factory =configuration.buildSessionFactory();

Session session = factory.openSession();

return session;

}

个表添加数据,这个方法里面我打了注释。因为如果你同时向中间表里面加数据,那肯定会报错的。试想两个set都是描述的是一种关系。那么同时插入一定会报错。

public static void add() {

// Set<Student> setStu = newHashSet<Student>();

Set<Teacher> setTea = newHashSet<Teacher>();

Teacher teacher = new Teacher();

Student student = new Student();

student.setName("qwe");

teacher.setName("黄老师");

// setStu.add(student);

setTea.add(teacher);

student.setTeachers(setTea);

// teacher.setStudents(setStu);

Session session = getMySession();

Transaction transaction = session.beginTransaction();

transaction.begin();

session.save(student);

session.save(teacher);

transaction.commit();

session.close();

}

public static void query() {

String hql = "from Teacher";

Session session = getMySession();

Query query = session.createQuery(hql);

List<Teacher> list = query.list();

for (Teacher i : list) {

System.out.println(i.getName() + "有学生:");

for (Student j : i.getStudents()) {

System.out.print(j.getName());

}

System.out.println();

}

session.close();

}

public static void main(String[] args) {

query();

}

}

接着我给你们看看这三个表的数据库中的数据。

查询结果是:

hibernate的多对多例子讲解(加图片)的更多相关文章

  1. 解析苹果的官方例子LazyTableImages实现图片懒加载原理

    解析苹果的官方例子LazyTableImages实现图片懒加载原理 首先在官网下载源码: https://developer.apple.com/library/ios/navigation/#sec ...

  2. 用最简单的例子实现jQuery图片即时上传

    [http://www.cnblogs.com/Zjmainstay/archive/2012/08/09/jQuery_upload_image.html] 最近看了一些jQuery即时上传的插件, ...

  3. 【SSH系列】Hibernate映射 -- 多对多关联映射

         映射原理 在数据库学习阶段,我们知道,如果实体和实体之间的关系是多对多,那么我们就抽出来第三张表,第一张表和第二张表的主键作为第三表的联合主键,结合我们的hibernate,多对多关联,无论 ...

  4. Hibernate的多对多实例

    在完成了一对多的实例的基础上,继续做多对多实例.例子是老师和学生,一个老师教多个学生,一个学生也有多个老师. 文档结构如图:

  5. Hibernate Validation使用示例及讲解

    Hibernate Validation使用示例及讲解 时间 -- :: ITeye-博客 原文 http://wdmcygah.iteye.com/blog/2174680 主题 Java 在项目开 ...

  6. hibernate中多对多关联

    hibernate中多对多关联 “计应134(实验班) 凌豪” 在关系数据库中有一种常见的关系即多对多关系,例如课程和学生的关系,一个学生可以选择多门课程,同时一门课程也可以被多个学生选择, 因此课程 ...

  7. Hibernate + Spring (quartz) 整合懒(延迟)加载问题

    开发项目的时候 在一个Job中执行了数据库操作, 用的是懒加载,但是如下错误 org.hibernate.LazyInitializationException: failed to lazily i ...

  8. css transition transform animation例子讲解

    1.transition属性: transition属性是一个速记属性有四个属性:transition-property , transition-duration, transition-timin ...

  9. hibernate 中 fetch=FetchType.LAZY 懒加载失败处理

    对这种懒加载问题,最后的做法是利用Spring提供的一个针对Hibernate的一个支持类,其主要意思是在发起一个页面请求时打开Hibernate的Session,一直保持这个Session,使得Hi ...

随机推荐

  1. 日常开发中常见的HTTP协议的状态码

    301Moved Permanently请求的网页已永久移动到新位置.服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将申请人转到新位置.您应使用此代码告诉 Googlebot 某个 ...

  2. 如何在安装程序中判断操作系统是否是64位 inno

    [Setup]; 开启64位模式ArchitecturesInstallIn64BitMode=x64 [Run] ;根据是否是64位进行不同的操作Filename: "..."; ...

  3. 水星Mercury路由器端口映射设置图文方法

    在一些内网的环境里,你可能需要把自己的内网的WEB服务器或者其他应用服务器设置成通过互联网可以访问,但是在内网我们是通过路由器共享上网的,外网无法访问到我们的内部服务器.那么这就需要我们通过" ...

  4. Revit中如何添加水平仰视平面视图

    在Revit平面视图中视角是俯视视角,但是在一些特殊的情况下,我们可能需要创建仰视视角的平面视图,例如我们需要向上看天花板的灯具布置的时候,下面举例说明添加仰视平面视图的方法. 如图在模型中有一楼板跟 ...

  5. 关于H.264 x264 h264 AVC1

    1. H.264是MPEG4的第十部分,是一个标准.对头,国际上两个视频专家组(VCEG和MPEG)合作提出的标准,两个专家组各有各的叫法,所以既叫H.264,也叫AVC. 2.x264是一个编码器, ...

  6. vim语法高亮不起作用解决

    首先将vim更新为最新版yum -y install vim,并安装Vim的加强版vim-enhanced ,以安装支持彩色的组件    yum -y install vim-enhanced 接下来 ...

  7. Oracle Redo Log 机制 小结(转载)

    Oracle 的Redo 机制DB的一个重要机制,理解这个机制对DBA来说也是非常重要,之前的Blog里也林林散散的写了一些,前些日子看老白日记里也有说明,所以结合老白日记里的内容,对oracle 的 ...

  8. 基于 Quartz 开发企业级任务调度应用

    原文地址:http://www.ibm.com/developerworks/cn/opensource/os-cn-quartz/index.html Quartz 基本概念及原理 Quartz S ...

  9. Hadoop学习篇 2 初识 Hadoop

    在一个全配置的集群上,运行Hadoop意味着在网络分布的不同服务器上运行一组守护进程 (daemons),这些守护进程或运行在单个服务器上,或运行与多个服务器上,他们包括: (1) NameNode( ...

  10. Core Java - 流(Stream) - 字节流和字符流(一)

    0. 概述: Java中基于流的I/O构建在4个抽象类之上, 其中2个是字节流,另外2个是字符流. 字节流: InputStream / OutputStream 当操作字节或其它二进制对象时,应当使 ...