Hibernate5入门(四)映射之多对多

目录

一、概述

二、多对多(双向)

2.1 老师实体类Teacher.java

2.2 学生实体类Student.java

2.3 老师映射文件Teacher.hbm.xml

2.4 学生映射文件Student.hbm.xml

2.5测试


 学习笔记,为了加强记忆和深入理解在此记录备忘。如有错误和理解不当之处,还望指正。万分感谢!

另外,实例和内容有些是参照网络其他博文,如有侵权可联系删掉。

学习重点:

多对多映射文件的配置


 

一、概述

一般的设计中,多对多关联映射,需要一个中间表 Hibernate使用many-to-many标签来表示多对多。多对多其实也分单向多对多和双向多对多,在日常使用比较多的是双向多对多。

以学生和老师进行实验。一个学生可以有多个老师教授,一个老师可以教多个学生。在关系表中学生编号和教师编号分别为俩个表的外键,他俩自身为联合主键。

在前面(一对多)已经介绍过单向和双向的区别,所以这里不再描述单向和双向,以下示例为多对多

 

二、多对多(双向)

2.1 老师实体类Teacher.java

package demo.entity;

import java.util.Set;

public class Teacher {

	private int teaId;
	private String teaName;
	// 学生集合
	private Set<Student> students;
	
	public int getTeaId() {
		return teaId;
	}
	public void setTeaId(int teaId) {
		this.teaId = teaId;
	}
	public String getTeaName() {
		return teaName;
	}
	public void setTeaName(String teaName) {
		this.teaName = teaName;
	}
	public Set<Student> getStudents() {
		return students;
	}
	public void setStudents(Set<Student> students) {
		this.students = students;
	}
}

2.2 学生实体类Student.java

package demo.entity;

import java.util.Set;

public class Student {

	private int stuId;
	private String stuName;
	private Set<Teacher> teachers;
	
	public int getStuId() {
		return stuId;
	}
	public void setStuId(int stuId) {
		this.stuId = stuId;
	}
	public String getStuName() {
		return stuName;
	}
	public void setStuName(String stuName) {
		this.stuName = stuName;
	}
	public Set<Teacher> getTeachers() {
		return teachers;
	}
	public void setTeachers(Set<Teacher> teachers) {
		this.teachers = teachers;
	}
}

2.3 老师映射文件Teacher.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2018-7-31 10:45:48 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
    <class name="demo.entity.Teacher" table="t_teacher">
        <id name="teaId" type="int">
            <column name="teaId" />
            <generator class="native" />
        </id>
        <property name="teaName" type="java.lang.String">
            <column name="teaName" />
        </property>
        <!-- 这里的table是指连接表的名称 -->
        <set name="students" table="t_stu_tea" inverse="false" lazy="true">
        	<!-- 这个是关联表的字段名,同时是Teacher的外键 -->
            <key column="teaId" />
            <many-to-many class="demo.entity.Student" column="stuId"/>
        </set>
    </class>
</hibernate-mapping>

2.4 学生映射文件Student.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2018-7-31 10:45:48 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
    <class name="demo.entity.Student" table="t_student">
        <id name="stuId" type="int">
            <column name="stuId" />
            <generator class="native" />
        </id>
        <property name="stuName" type="java.lang.String">
            <column name="stuName" />
        </property>
        <!-- 这里的table是指连接表的名称 -->
        <set name="teachers" table="t_stu_tea" inverse="false" lazy="true">
        	<!-- 这个是关联表的字段名,同时是Teacher的外键 -->
            <key>
                <column name="stuId" />
            </key>
            <many-to-many class="demo.entity.Teacher" column="teaId"/>
        </set>
    </class>
</hibernate-mapping>

2.5测试

package demo.test;

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

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import demo.entity.Student;
import demo.entity.Teacher;

class JunitTest {

	private Configuration configuration = new Configuration().configure();
	private SessionFactory sFactory = configuration.buildSessionFactory();
	private Session session = null;
	private Transaction transaction = null;
	@BeforeEach
	void setUp() throws Exception {
		session = sFactory.openSession();
		transaction = session.beginTransaction();
	}

	@AfterEach
	void tearDown() throws Exception {
		transaction.commit();
		session.close();
	}

	@Test
	void testSave() {
		Teacher teacher1 = new Teacher();
		teacher1.setTeaName("老师1");
		Teacher teacher2 = new Teacher();
		teacher2.setTeaName("老师2");
		
		Student student1 = new Student();
		student1.setStuName("学生1");
		Student student2 = new Student();
		student2.setStuName("学生2");
		
		Set<Teacher> teachers = new HashSet<>();
		teachers.add(teacher1);
		teachers.add(teacher2);
		// 学生1有俩个老师
		student1.setTeachers(teachers);
		
		
		session.save(teacher1);
		session.save(teacher2);
		session.save(student1);
		session.save(student2);
		
	}

}

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值