你的位置:首页 > 数据库

[数据库]hibernate(九)多对多关联


一、多对多单向关联

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

配置方式是在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;@Entitypublic 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;@Entitypublic 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;@Entitypublic 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;@Entitypublic 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)