当前位置: 代码迷 >> MySQL >> hibernate(9)多对多关联
  详细解决方案

hibernate(9)多对多关联

热度:221   发布时间:2016-05-05 16:28:57.0
hibernate(九)多对多关联

一、多对多单向关联

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

配置方式是在Teacher类的getStudents()[email protected]

@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()[email protected](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)

 

  相关解决方案