原文链接:http://www.orlion.ml/29/

一、多对多单向关联

假设一个老师教多个学生,一个学生被多个老师教,这就是典型的多对多关系

配置方式是在Teacher类的getStudents()方法上添加注解@ManyToMany

@JoinTable(name="t_s" ,

joinColumns = { @JoinColumn(name="teacher_id")},

inverseJoinColumns = { @JoinColumn(name="student_id")}

)

Teacher类:

package cn.orlion.hibernate.model;

import java.util.HashSet;
import java.util.Set; import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
@Entity
public class Teacher { private int id; private String name; private Set<Student> students = new HashSet<Student>();
@Id
@GeneratedValue
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;
}
@ManyToMany
@JoinTable(name="t_s" , // t_s是生成的中间表的表名
joinColumns = { @JoinColumn(name="teacher_id")},// teacher_id是生成中间表中参考自Teacher的外键
inverseJoinColumns = { @JoinColumn(name="student_id")}// inverseJoinColumns配置的是反转的对象(即Student)的idstudent_id是中间表中参考自Student的外键
)
public Set<Student> getStudents() {
return students;
} public void setStudents(Set<Student> students) {
this.students = students;
} }

Student类:

package cn.orlion.hibernate.model;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity
public class Student { private int id; private String name;
@Id
@GeneratedValue
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;
}
}

生成的sql语句:

create table Student (
id integer not null auto_increment,
name varchar(255),
primary key (id)
) create table Teacher (
id integer not null auto_increment,
name varchar(255),
primary key (id)
) create table t_s (
teacher_id integer not null,
student_id integer not null,
primary key (teacher_id, student_id)
) alter table t_s
add constraint FK_3no0wm9bwtogr87t4gvd4t3x5
foreign key (student_id)
references Student (id) alter table t_s
add constraint FK_pj2fmd6skwfi7jm2avlo4n6mf
foreign key (teacher_id)
references Teacher (id)

二、多对多双向关联

单向关联可一理解为:老师知道教的学生的名字,但是学生不知道教的多个老师。

双向关联可以理解为:老师知道教的学生的名字,学生也知道教的多个老师。

配置方式:Teacher类与单向关联相同,Student类添加Set<Teacher> teachers属性,在getTeaches()方法上添加注解@ManyToMany(mappedBy="students")

Teacher类:

package cn.orlion.hibernate.model;

import java.util.HashSet;
import java.util.Set; import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
@Entity
public class Teacher { private int id; private String name; private Set<Student> students = new HashSet<Student>();
@Id
@GeneratedValue
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;
}
@ManyToMany
@JoinTable(name="t_s" , // t_s是生成的中间表的表名
joinColumns = { @JoinColumn(name="teacher_id")},
inverseJoinColumns = { @JoinColumn(name="student_id")}
)
public Set<Student> getStudents() {
return students;
} public void setStudents(Set<Student> students) {
this.students = students;
} }

Student类:

package cn.orlion.hibernate.model;

import java.util.HashSet;
import java.util.Set; import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
@Entity
public class Student { private int id; private String name; private Set<Teacher> teachers = new HashSet<Teacher>();
@Id
@GeneratedValue
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;
}
@ManyToMany(mappedBy="students")
public Set<Teacher> getTeachers() {
return teachers;
} public void setTeachers(Set<Teacher> teachers) {
this.teachers = teachers;
}
}

生成的sql语句:

create table Student (
id integer not null auto_increment,
name varchar(255),
primary key (id)
) create table Teacher (
id integer not null auto_increment,
name varchar(255),
primary key (id)
) create table t_s (
teacher_id integer not null,
student_id integer not null,
primary key (teacher_id, student_id)
) alter table t_s
add constraint FK_3no0wm9bwtogr87t4gvd4t3x5
foreign key (student_id)
references Student (id) alter table t_s
add constraint FK_pj2fmd6skwfi7jm2avlo4n6mf
foreign key (teacher_id)
references Teacher (id)

hibernate(九)多对多关联的更多相关文章

  1. hibernate中多对多关联

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

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

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

  3. Hibernate双向多对多关联

    一.配置双向多对多关联 以Project类(项目)和Emp类(员工)为例: 1.创建Project类,并需要定义集合类型的Emp属性 public class Project { //编号 priva ...

  4. (Hibernate进阶)Hibernate映射——多对多关联映射(八)

    多对多映射是现实生活中最常见的映射,也是最容易理解的映射.废话少说,直接开始. 映射原理 不论是单向关联还是双向关联都是通过第三张表,将两个表中的主键放到第三张做一个关联.用第三张表来解决可能会造成数 ...

  5. hibernate的多对多关联映射

    在我们实际项目中,多对多的情况也时长存在,比如最常见的就是系统管理的五张表,如下面的一个结构: 在本文学习hibernate多对多关联映射的实验中我简单的写几个字段,达到学习目的即可. 1.多对多的关 ...

  6. 【SSH进阶之路】Hibernate映射——多对多关联映射(八)

    上篇博文[SSH进阶之路]Hibernate映射——一对多关联映射(七),我们介绍了一对多关联映射,它是多对多关联映射的基础. 多对多映射是现实生活中最常见的映射,也是最容易理解的映射.废话少说,直接 ...

  7. Hibernate单向“多对一”关联

    1. 基于外键关联的单向“多对一”关联是最常见的单向关联其中指定many-to-one的unique="true",为单向“一对一”,不指定就是单向“多对一” <class  ...

  8. 8.Hibernate的多对多关联映射

    1.创建如下数据库脚本 --1.1 项目表 create table PROJECT ( proid ) not null, proname ) ) ; --1.2 项目表主键 alter table ...

  9. 3、Hibernate的多表关联

    一.数据库中的表关系: 一对一关系 一个人对应一张身份证,一张身份证对应一个人,一对一关系是最好理解的一种关系,在数据库建表的时候可以将人表的主键放置与身份证表里面,也可以将身份证表的主键放置于人表里 ...

  10. 【Hibernate框架】关联映射(多对多关联映射)

    按着我们的总结行进计划,接下来,就是有关于多对多映射的总结了. 我们来举个例子啊,很长时间以来,房价暴涨不落,但是还有很多人拥有很多套房产,假如说,一个富豪拥有九套房产,家里人么准去住哪一套,我们就以 ...

随机推荐

  1. myeclipse使用maven插件进行maven install时报错check $m2_home environment variable and mvn script match

    check $m2_home environment variable and mvn script match 分类: maven2015-09-01 18:06 842人阅读 评论(0) 收藏 举 ...

  2. No operation was found with the name {http://impl.service.xq.com/}sayHi

    org.apache.cxf.common.i18n.UncheckedException: No operation was found with the name {http://impl.ser ...

  3. android wifi ANR问题分析总结

    android wifi ANR问题分析总结 1 看看main进程阻塞在那里? 2 调用关系的函数阻塞在那里? 3 最终阻塞函数的阻塞前的log以及状态

  4. 大数据存储:MongoDB实战指南——常见问题解答

    锁粒度与并发性能怎么样? 数据库的读写并发性能与锁的粒度息息相关,不管是读操作还是写操作开始运行时,都会请求相应的锁资源,如果请求不到,操作就会被阻塞.读操作请求的是读锁,能够与其它读操作共享,但是当 ...

  5. TableLayout表格布局详解

    一.Tablelayout简介 Tablelayout类以行和列的形式对控件进行管理,每一行为一个TableRow对象,或一个View控件.当为TableRow对象时,可在TableRow下添加子控件 ...

  6. MySQL 5.6.17 rpm 文件安装顺序

     Linux系统安装MySQL时,将MySQL-5.6.17-1.el6.x86_64.rpm-bundle.tar包打开,有7个rpm文件,如下: MySQL-client-5.6.17-1.el6 ...

  7. centos7 memcached+memagent 集群

    1. 安装libevent wget https://github.com/libevent/libevent/releases/download/release-2.0.22-stable/libe ...

  8. ASP.NET 5 入门 (2) – 自定义配置

    ASP.NET 5 入门 (2) – 自定义配置 ASP.NET 5 理解和入门 建立和开发ASP.NET 5 项目 初步理解ASP.NET5的配置 正如我的第一篇文章ASP.NET 5 (vNext ...

  9. web.xml详解

    web.xml的作用 web.xml,一个Tomcat工程中最重要的配置文件.web.xml没有其实也可以----只要你确定你的项目里面不需要任何过滤器.监听器.Servlet等等.我试了一下,没有w ...

  10. Java虚拟机6:内存溢出和内存泄露、并行和并发、Minor GC和Full GC、Client模式和Server模式的区别

    前言 之前的文章尤其是讲解GC的时候提到了很多的概念,比如内存溢出和内存泄露.并行与并发.Client模式和Server模式.Minor GC和Full GC,本文详细讲解下这些概念的区别. 内存溢出 ...