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;
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值