Hibernate关联关系中相对比较特殊的就是多对多关联,多对多关联与一对一关联和一对多关联不同,多对多关联需要另外一张映射表用于保存多对多映射信息。本例介绍多对多单向关联和双向关联。单向关联 :指具有关联关系的实体对象间的加载与访问关系是单向的。即,只有一个实体对象可以加载和访问对方,但对方是看不到另一方的。双向关联:双向关联是指具有关联关系的实体对象间的加载与访问关系是双向的。即,任何一方均可加载和访问另一方。

一、多对多单向关联

1、首先创建一个数据库,一条SQL语句搞定

create database many_to_many;

2、配置hibernate.cfg.xml

hibernate.cfg.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">
com.mysql.jdbc.Driver
</property>
<property name="hibernate.connection.url">
jdbc:mysql:///many_to_many
</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">123456</property>
<property name="hibernate.dialect">
org.hibernate.dialect.MySQL5Dialect
</property>
<property name="hibernate.connection.provider_class">
org.hibernate.c3p0.internal.C3P0ConnectionProvider
</property>
<property name="hibernate.current_session_context_class">
thread
</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.format_sql">true</property>
<mapping resource="com/beans/Course.hbm.xml" />
<mapping resource="com/beans/Student.hbm.xml" />
</session-factory>
</hibernate-configuration>

3、创建实体类及其对应的映射文件

Course.java:

package com.beans;

public class Course {
private int cid;
private String cname;

  public Course(String cname) {
    // TODO Auto-generated constructor stub
    this.cname = cname;
  }
  public int getCid() {
    return cid;
  }

  public void setCid(int cid) {
    this.cid = cid;
  }

  public String getCname() {
    return cname;
  }

  public void setCname(String cname) {
    this.cname = cname;
  }
}

Course.hbm.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.beans">
<!-- 完成类到表的映射,属性到字段的映射 -->
<class name="Course">
<id name="cid">
<generator class="native" />
</id>
<property name="cname"/>
</class>
</hibernate-mapping>

Student.java:

package com.beans;

import java.util.HashSet;
import java.util.Set;

public class Student {
  private int sid;
  private String sname;
  private Set<Course> courses;
  public Student(String sname) {
    this();
    this.sname = sname;
  }
  public Student() {
    // TODO Auto-generated constructor stub
    courses = new HashSet<Course>();
  }
  public int getSid() {
  return sid;
  }
  public void setSid(int sid) {
    this.sid = sid;
  }
  public String getSname() {
    return sname;
  }
  public void setSname(String sname) {
    this.sname = sname;
  }
  public Set<Course> getCourses() {
    return courses;
  }
  public void setCourses(Set<Course> courses) {
    this.courses = courses;
  }
}

Student.hbm.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.beans">
<!-- 完成类到表的映射,属性到字段的映射 -->
<class name="Student">
<id name="sid">
<generator class="native" />
</id>
<property name="sname"/>
<set name="courses" cascade="save-update" table="middle" inverse="false">
<key column="studentId" /><!-- 指定当前类在中间表对应的外键 -->
<many-to-many class="Course" column="courseId"/><!-- 指定关联类在中间表中对应的外键 -->
</set>
</class>
</hibernate-mapping>

4、编写测试类

MyTest.java:

package com.test;

import org.hibernate.Session;
import org.junit.Test;

import com.beans.Course;
import com.beans.Student;
import com.utils.HbnUtils;

public class MyTest {

  @Test
  public void test01() {
    Session session = HbnUtils.getSession();//HbnUtils为封装好的工具类

    try {
      session.beginTransaction();//开启事务
      Course course1 = new Course("struts2");
      Course course2 = new Course("hibernate5");
      Course course3 = new Course("spring4");
      Course course4 = new Course("mybatis");

      Student student1 = new Student("Thanlon");
      Student student2 = new Student("Tom");

      student1.getCourses().add(course1);
      student1.getCourses().add(course2);
      student1.getCourses().add(course3);
      student1.getCourses().add(course4);

      student2.getCourses().add(course1);
      student2.getCourses().add(course2);
      student2.getCourses().add(course3);

      session.save(student1);
      session.save(student2);
      session.getTransaction().commit();

      } catch (Exception e) {
        // TODO: handle exception
        e.printStackTrace();
        session.getTransaction().rollback();
      }
   }
}

测试结果:

课程表:

学生表:

中间表:

二、多对多双向关联

1、接着上面的,可修改Course类如下。

Course.java:

package com.beans;

import java.util.HashSet;
import java.util.Set;

public class Course {
  private int cid;
  private String cname;
  private Set<Student> students;

  public Course(String cname) {
    this();
    this.cname = cname;
  }

  public Course() {
    // TODO Auto-generated constructor stub
    students = new HashSet<Student>();
  }

  public Set<Student> getStudents() {
    return students;
  }

  public void setStudents(Set<Student> students) {
    this.students = students;
  }

  public int getCid() {
    return cid;
  }

  public void setCid(int cid) {
    this.cid = cid;
  }

  public String getCname() {
    return cname;
  }

  public void setCname(String cname) {
    this.cname = cname;
  }
}

2、映射文件可做如下修改

Course.hbm.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.beans">
<!-- 完成类到表的映射,属性到字段的映射 -->
<class name="Course">
<id name="cid">
<generator class="native" />
</id>
<property name="cname" /> <set name="students" cascade="save-update" table="middle" inverse="false">
<key column="courseId" /><!-- 指定当前类在中间表对应的外键 -->
<many-to-many class="Student" column="studentId" /><!-- 指定关联类在中间表中对应的外键 -->
</set>
</class>
</hibernate-mapping>

3、接着是修改测试类:

MyTest.java:

package com.test;

import org.hibernate.Session;
import org.junit.Test;

import com.beans.Course;
import com.beans.Student;
import com.utils.HbnUtils;

public class MyTest {

  @Test
  public void test01() {
    Session session = HbnUtils.getSession();
    try {
      session.beginTransaction();

      Student student1 = new Student("Thanlon");
      Student student2 = new Student("Tom");

      Course course1 = new Course("struts2");
      Course course2 = new Course("hibernate5");
      Course course3 = new Course("mybatis");

      course1.getStudents().add(student1);
      course1.getStudents().add(student2);
      course2.getStudents().add(student1);
      course3.getStudents().add(student2);

      session.save(course1);
      session.save(course2);
      session.save(course3);

      session.getTransaction().commit();

    } catch (Exception e) {
      // TODO: handle exception
      e.printStackTrace();
      session.getTransaction().rollback();
    }
  }
}

测试结果:

课程表:

学生表

中间表:

完整项目文件参考:https://pan.baidu.com/s/1g1N-vN9dZ9I-cO9wFSciIg 密码:baae

附:个人网站www.nxl123.cn(后台采用Python Flask框架搭建,2019年1月1日将升级完成并正式上线。哎,本人是学生狗呢!网站做的不好希望大家多多提意见或建议吧!?嘿嘿!……以后SEO什么的还得多向大家学习……)

Hibernate多对多单向关联和双向关联 --Hibernate框架的更多相关文章

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

    Hibernate中用注解配置一对多双向关联和多对一单向关联 Hibernate提供了Hibernate Annotations扩展包,使用注解完成映射.在Hibernate3.3之前,需单独下载注解 ...

  2. hibernate多对一单向关联

    关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...

  3. Hibernate一对多单向关联和双向关联映射方法及其优缺点 (待续)

    一对多关联映射和多对一关联映射实现的基本原理都是一样的,既是在多的一端加入一个外键指向一的一端外键,而主要的区别就是维护端不同.它们的区别在于维护的关系不同: 一对多关联映射是指在加载一的一端数据的同 ...

  4. hibernate单向关联与双向关联的区别(原)

    今天看着hibernate的关联关系,有点迷糊.这里通过多对一表述一下双向与单向的区别. 多对一: 就是A表中的一个字段是B表的主键.多个A表中的数据可以对应一个B表中的数据,同理,一个B表中的数据可 ...

  5. Java进阶知识11 Hibernate多对多单向关联(Annotation+XML实现)

    1.Annotation 注解版 1.1.应用场景(Student-Teacher):当学生知道有哪些老师教,但是老师不知道自己教哪些学生时,可用单向关联 1.2.创建Teacher类和Student ...

  6. Java进阶知识08 Hibernate多对一单向关联(Annotation+XML实现)

    1.Annotation 注解版 1.1.在多的一方加外键 1.2.创建Customer类和Order类 package com.shore.model; import javax.persisten ...

  7. Hibernate(九)一对多双向关联映射

    上次的博文Hibernate从入门到精通(八)一对多单向关联映射中,我们讲解了一下一对多单向映射的相关 内容,这次我们讲解一下一对多双向映射的相关内容. 一对多双向关联映射 一对多双向关联映 射,即在 ...

  8. hibernate多对一单向外键

    hibernate多对一单向外键: 描述:

  9. hibernate多对一单向关联注解方式

    多对一单向关联,在多的一方加上一的一方作为外键.在程序里表现为:在多的一方加上一的引用. 小组类Group,用户User: Group: package com.oracle.hibernate; i ...

随机推荐

  1. matlab做聚类分析

    说明:如果是要用matlab做kmeans聚类分析,直接使用函数kmeans即可.使用方法:kmeans(输入矩阵,分类个数k). 转载一: MATLAB提供了两种方法进行聚类分析: 1.利用 clu ...

  2. 用vim + xdebug 来追踪thinkphp的执行过程

    tree命令的使用几个有实际应用的参数 -a 这是默认的 -d: 只显式目录, 不需要显式目录下的文件 -L: 列出显式的深度. 当前目录下的所有东西为第一级... 在tp下, 有多个Common但是 ...

  3. 浅谈FFT、NTT和MTT

    前言 \(\text{FFT}\)(快速傅里叶变换)是 \(O(n\log n)\) 解决多项式乘法的一个算法,\(\text{NTT}\)(快速数论变换)则是在模域下的,而 \(\text{MTT} ...

  4. Git-Flow | How it’s used and why you should

    Git-Flow | How it’s used and why you should What is Git-Flow about? Git-Flow is a workflow for using ...

  5. POJ 3126 Prime Path(素数路径)

    POJ 3126 Prime Path(素数路径) Time Limit: 1000MS    Memory Limit: 65536K Description - 题目描述 The minister ...

  6. SpringBoot war包部署到Tomcat服务器

    (1)pom.xml文件修改<packaging>war</packaging>,默认是jar包,<build>节点中增加<finalName>spri ...

  7. 同上两篇 这篇是关于shader的

    资源加载性能测试代码 与上篇所提出的测试代码一样,我们对于Shader资源的加载性能分析同样使用该测试代码.同时,我们将Shader文件制作成一定大小的AssetBundle文件,并逐一通过以下代码在 ...

  8. win10上安装keras

    下载Anaconda https://www.anaconda.com/ 点击进入下载界面 选择Windows版本64位,python3.7 下载完成后 ,双击安装 等待安装完成! 安装MinGW包, ...

  9. 服务器不能设置内容类型HTTP头信息后发送

    昨天一个用户反映,导出excel失败,我测试了一下,数据量小没有问题,数据量稍微大就会出现这个问题.咨询度娘也没有找到合适的解决方法,突然想到系统中,其他模块有下载excel附件的功能,但是从没有出现 ...

  10. maven 引入外部jar包的几种方式

    方式1:dependency 本地jar包 <dependency> <groupId>com.hope.cloud</groupId> <!--自定义--& ...