Hibernate关系映射之多对多映射的两种方式
多对多关系##
many-to-many
应用场景:不建议使用,建议拆解成两个“一对多”连接
关系定义(主控方):
//xml映射方法
<set name="propertyName" table="middle_table_name">
<key column="columnName_master" />
<many-to-many class="className" column="columnName_slave" />
</set>
//annotation注解映射方法
@ManyToMany
@JoinTable(name="middle_table_name"
joinColumns=@JoinColumn(name="columnName_master",
inverseJoinColumns=@JoinColumn(name="columnName_slave"))
)
关系定义(被控方)
//xml映射
<set name="propertyName" table="middle_table_name">
<key column="columnName_slave" />
<many-to-many class="className" column="columnName_master" />
</key>
//annotation注解映射
@ManyToMany(mappedBy="propertyName")
多对多映射代码##
说明:学生与学生之间的关系是多对多,一个学生可以对应多个教师,一个教师也可以对应多个学生。这里定义一个学生类Student和一个教师类Lecturer。
一.xml映射
1.新建Student.hbm.xml文件,在该文件里编写映射关系,Student为主控方。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.ffy.studentmanage.Student" table="student">
<id name="id" column="id">
<generator class="assigned"></generator>
</id>
<property name="sid" column="sid"></property>
<property name="firstName" column="firstname"></property>
<property name="lastName" column="lastname"></property>
<property name="gender" column="gender"></property>
<property name="phone" column="phone"></property>
<property name="email" column="email"></property>
<property name="dateOfBirth" column="date_of_birth"></property>
//一个学生可以有多个老师,所以需要用集合来放教师类。
//name:在student类中有一个存放类型为Lecturer的集合,这里的name为该set。table:学生和教师关系的中间表名称
<set name="lecturers" table="student_has_teacher">
//column:中间表的用于与student(我方)关联的外键。
<key column="student_id"></key>
//column:中间表的用于与lecturer(对方)关联的外键。 class:表示对方的类
<many-to-many column="lecturer_id" class="com.ffy.studentmanage.Lecture"></many-to-many>
</set>
</class>
</hibernate-mapping>
2.新建Leturer.hbm.xml(对方),填写映射关系
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.ffy.studentmanage.Lecture" table="lecturer">
<id name="id" column="id">
<generator class="assigned"></generator>
</id>
<property name="uid" column="uid"></property>
<property name="firstName" column="firstname"></property>
<property name="lastName" column="lastname"></property>
<property name="phone" column="phone"></property>
<property name="collegeId" column="college_id"></property>
//与上一步类似
<set name="students" table="student_has_teacher">
<key column="lecturer_id"></key>
<many-to-many column="student_id" class="com.ffy.studentmanage.Student"></many-to-many>
</set>
</class>
</hibernate-mapping>
3.在hibernate.cfg.xml中注册上面两个xml文件。
<mapping resource="Student.hbm.xml"/>
<mapping resource="Lecturer.hbm.xml"/>
二.annotation注解映射
1.在hibernate.cfg.xml中注册Student.class类和Lecturer.class类。
<mapping class="com.ffy.studentmanage.Student"/>
<mapping class="com.ffy.studentmanage.Lecture"/>
2.在Student.class类里面添加注解。
package com.ffy.studentmanage;
import java.util.Set;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
@Entity
@Table(name="student")
public class Student {
@Id
@Column(name="id")
private int id;
@Column(name="sid")
private int sid;
@Column(name="firstname")
private String firstName;
@Column(name="lastname")
private String lastName;
@Column(name="gender")
private String gender;
@Column(name="phone")
private String phone;
@Column(name="email")
private String email;
@Column(name="date_of_birth")
private String dateOfBirth;
@Column(name="height")
private double height;
//声明多对多关系
@ManyToMany
@JoinTable(name="student_has_teacher",
joinColumns=@JoinColumn(name="student_id"),
inverseJoinColumns=@JoinColumn(name="lecturer_id"))
private Set<Lecture> lecturers;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getSid() {
return sid;
}
public void setSid(int sid) {
this.sid = sid;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastname() {
return lastName;
}
public void setLastname(String lastName) {
this.lastName = lastName;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getDateOfBirth() {
return dateOfBirth;
}
public void setDateOfBirth(String dateOfBirth) {
this.dateOfBirth = dateOfBirth;
}
public double getHeight() {
return height;
}
public void setHeight(double height) {
this.height = height;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public Set<Lecture> getLecturers() {
return lecturers;
}
public void setLecturers(Set<Lecture> lecturers) {
this.lecturers = lecturers;
}
// public String toString(){
// return this.id+":"+this.lastName+this.firstName+this.gender+":"+this.phone+":"+this.email+";username"+studentLogin.getUsername()+";password:"+studentLogin.getPassword();
// }
}
3.在Lecturer.class里面添加注解
package com.ffy.studentmanage;
import java.util.Set;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
@Entity
@Table(name="lecturer")
public class Lecture {
@Id
@Column(name="id")
private int id;
@Column(name="uid")
private String uid;
@Column(name="firstname")
private String firstName;
@Column(name="lastname")
private String lastName;
@Column(name="phone")
private String phone;
@Column(name="college_id")
private int collegeId;
//将权限交由对方,即Student.class。主控方与被控方通过主控方里的lecturers属性建立联系。
@ManyToMany(mappedBy="lecturers")
private Set<Student> students;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUid() {
return uid;
}
public void setUid(String uid) {
this.uid = uid;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public int getCollegeId() {
return collegeId;
}
public void setCollegeId(int collegeId) {
this.collegeId = collegeId;
}
public Set<Student> getStudents() {
return students;
}
public void setStudents(Set<Student> students) {
this.students = students;
}
}
还没有评论,来说两句吧...