爱程序网

hibernate(九)多对多关联

来源: 阅读:

原文链接: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;@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)

 

相关文章列表:
关于爱程序网 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 版权声明 - 人才招聘 - 帮助