Hibernate框架-06-01-多对多关联映射


实体多对多关联

在这里插入图片描述

在某高校选课系统中,一个学生可以同时选修多门课程,一门课程可以被若干个学生选修,像这样的多对多关联关系,应该如何实现?

在这里插入图片描述

数据库多对多关联

为了表示多对多关系,需要创建中间表。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

xml格式配置

项目结构

在这里插入图片描述

Course.java

package com.hibernate.entity;

import java.util.HashSet;
import java.util.Set;

public class Course {
    
    

	private Integer id;
	private String courseName;
	private int credit;//学分
	
	//与Student之间的多对多
	private Set students = new HashSet<>();

	public Integer getId() {
    
    
		return id;
	}

	public void setId(Integer id) {
    
    
		this.id = id;
	}

	public String getCourseName() {
    
    
		return courseName;
	}

	public void setCourseName(String courseName) {
    
    
		this.courseName = courseName;
	}

	public int getCredit() {
    
    
		return credit;
	}

	public void setCredit(int credit) {
    
    
		this.credit = credit;
	}

	public Set getStudents() {
    
    
		return students;
	}

	public void setStudents(Set students) {
    
    
		this.students = students;
	}

	@Override
	public String toString() {
    
    
		return "Course [id=" + id + ", courseName=" + courseName + ", credit=" + credit + ", students=" + students
				+ "]";
	}
	
	
}

Student.java

package com.hibernate.entity;

import java.util.HashSet;
import java.util.Set;

public class Student {
    
    

	private Integer id;
	private String stuName;
	private String stuNo;
	
	private Set courses = new HashSet<>();//直接初始化,防止空引用异常

	public Integer getId() {
    
    
		return id;
	}

	public void setId(Integer id) {
    
    
		this.id = id;
	}

	public String getStuName() {
    
    
		return stuName;
	}

	public void setStuName(String stuName) {
    
    
		this.stuName = stuName;
	}

	public String getStuNo() {
    
    
		return stuNo;
	}

	public void setStuNo(String stuNo) {
    
    
		this.stuNo = stuNo;
	}

	public Set getCourses() {
    
    
		return courses;
	}

	public void setCourses(Set courses) {
    
    
		this.courses = courses;
	}

	@Override
	public String toString() {
    
    
		return "Student [id=" + id + ", stuName=" + stuName + ", stuNo=" + stuNo + ", courses=" + courses + "]";
	}
	
	
}

Course.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 package="com.hibernate.entity">
    <class name="Course" table="hibernate_06_01_course">
        <id name="id" type="int" column="id">
            <generator class="identity"></generator>
        </id>
        <property name="courseName" column="COURSE_NAME" ></property>
        <property name="credit"/>
        
        <!-- 映射Course与Student之间的多对多关系
        	set用来映射Set类型的属性
        	table:指定中间表表名
        	key:指定外键字段名字(在中间表中参照当前实体类对应表)
        	many-to-many表示多对多关系 column="COURSE_ID"(指定中间表中参照关联类型对应表的外键)
        	inverse="true"放弃维护关联关系(Course作为被控方) -->
        <set name="students" table="hibernate_06_01_student_course" inverse="true">
        	<key column="COURSE_ID"/>
        	<many-to-many class="Student" column="STU_ID"/>
        </set>
    </class>
</hibernate-mapping>

Student.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 package="com.hibernate.entity">
    <class name="Student" table="hibernate_06_01_studnet">
        <id name="id" type="int" column="id">
            <generator class="identity"></generator>
        </id>
        <property name="stuName" column="STU_NAME" ></property>
        <property name="stuNo" column="STU_NO"/>
        
        <!-- 映射Student与Course之间的多对多关系
        	set用来映射Set类型的属性
        	table:指定中间表表名
        	key:指定外键字段名字(在中间表中参照当前实体类对应表)
        	many-to-many表示多对多关系 column="COURSE_ID"(指定中间表中参照关联类型对应表的外键) -->
        <set name="courses" table="hibernate_06_01_student_course" >
        	<key column="STU_ID"/>
        	<!-- 配置另一个外键 -->
        	<many-to-many class="Course" column="COURSE_ID"/>
        </set>
    </class>
</hibernate-mapping>

Test.java

package com.hibernate.ui;

import org.hibernate.Session;
import org.hibernate.Transaction;

import com.hibernate.entity.Course;
import com.hibernate.entity.Student;
import com.hibernate.util.HibernateUtil;

public class Test {
    
    

	public static void main(String[] args) {
    
    
		save();
		
		HibernateUtil.closeSessionFactory();
	}

	//保存学生和课程
	private static void save() {
    
    
		Session session = HibernateUtil.openSession();
		Transaction tx = session.beginTransaction();
		
		Student stu = new Student();
		stu.setStuName("张三");
		stu.setStuNo("2018011000");
		
		Course cou = new Course();
		cou.setCourseName("Android基础编程");
		cou.setCredit(4);
		
		//建立关联
		stu.getCourses().add(cou);
		//当Course作为被控方时,即便程序中修改了Course对象关联的学生,也不会去修改中间表
		//修改包括插入与删除
		cou.getStudents().add(stu);
		
		session.save(stu);
		session.save(cou);
		
		tx.commit();
		session.close();
	}
}







注解格式配置

在这里插入图片描述

扫描二维码关注公众号,回复: 13070210 查看本文章

在这里插入图片描述

项目结构

在这里插入图片描述

Course.java

package com.hibernate.entity;

import java.util.HashSet;
import java.util.Set;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.Table;

@Entity
@Table(name="hibernate_06_01_course")
public class Course {
    
    

	private Integer id;
	private String courseName;
	private int credit;//学分
	
	//与Student之间的多对多
	private Set students = new HashSet<>();

	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)//identity室友数据库决定的
	public Integer getId() {
    
    
		return id;
	}

	public void setId(Integer id) {
    
    
		this.id = id;
	}

	@Column(name="course_name")
	public String getCourseName() {
    
    
		return courseName;
	}

	public void setCourseName(String courseName) {
    
    
		this.courseName = courseName;
	}

	public int getCredit() {
    
    
		return credit;
	}

	public void setCredit(int credit) {
    
    
		this.credit = credit;
	}

	//为了判断集合中对象的类型
	@ManyToMany(mappedBy="courses",targetEntity=Student.class)
	public Set getStudents() {
    
    
		return students;
	}

	public void setStudents(Set students) {
    
    
		this.students = students;
	}

	@Override
	public String toString() {
    
    
		return "Course [id=" + id + ", courseName=" + courseName + ", credit=" + credit + ", students=" + students
				+ "]";
	}
}

Student.java

package com.hibernate.entity;

import java.util.HashSet;
import java.util.Set;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.Table;

@Entity
@Table(name="hibernate_06_01_studnet")
public class Student {
    
    

	private Integer id;
	private String stuName;
	private String stuNo;
	
	private Set<Course> courses = new HashSet<>();

	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	public Integer getId() {
    
    
		return id;
	}

	public void setId(Integer id) {
    
    
		this.id = id;
	}

	@Column(name="STU_NAME")
	public String getStuName() {
    
    
		return stuName;
	}

	public void setStuName(String stuName) {
    
    
		this.stuName = stuName;
	}

	@Column(name="STU_NO")
	public String getStuNo() {
    
    
		return stuNo;
	}

	public void setStuNo(String stuNo) {
    
    
		this.stuNo = stuNo;
	}

	@ManyToMany//映射多对多关系
	//映射中间表
	//name=中间表表明
	//joinColumns=外键字段
	//inverseJoinColumns
	@JoinTable(name="hibernate_06_01_student_course",
	    joinColumns=@JoinColumn(name="STU_ID"),
	    inverseJoinColumns=@JoinColumn(name="COURSE_ID"))
	public Set<Course> getCourses() {
    
    
		return courses;
	}
	//这里和上面的定义时候加上课泛型,可以省略targerEntity标签
	
	
	

	public void setCourses(Set<Course> courses) {
    
    
		this.courses = courses;
	}

	@Override
	public String toString() {
    
    
		return "Student [id=" + id + ", stuName=" + stuName + ", stuNo=" + stuNo + ", courses=" + courses + "]";
	}
}

猜你喜欢

转载自blog.csdn.net/qq_44627608/article/details/115180644