技术分析之Hibernate的关联关系映射之多对多映射

多对多的表映射关系可以相当于是老师和学生,一个老师可以有多个学生,一个学生也可以有多个老师,下面是学生老师表的配置和代码

Student类

package pojo;

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

public class Student {
	//sid   sname    sgender  
	private Long sid;
	private String sname;
	private String sgender;
	
	//集合Teacher
	private Set<Teacher>teachers=new HashSet<>();

	public Long getSid() {
		return sid;
	}

	public void setSid(Long sid) {
		this.sid = sid;
	}

	public String getSname() {
		return sname;
	}

	public void setSname(String sname) {
		this.sname = sname;
	}

	public String getSgender() {
		return sgender;
	}

	public void setSgender(String sgender) {
		this.sgender = sgender;
	}

	public Set<Teacher> getTeachers() {
		return teachers;
	}

	public void setTeachers(Set<Teacher> teachers) {
		this.teachers = teachers;
	}

	@Override
	public String toString() {
		return "Student [sid=" + sid + ", sname=" + sname + ", sgender=" + sgender + "]";
	}

	public Student(Long sid, String sname, String sgender, Set<Teacher> teachers) {
		super();
		this.sid = sid;
		this.sname = sname;
		this.sgender = sgender;
		this.teachers = teachers;
	}

	public Student() {
		super();
		// TODO Auto-generated constructor stub
	}
	
	
	
	
	

}

Teacher类

package pojo;

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

public class Teacher {
	//tid  tanme  tsex
	private Long tid;
	private String tname;
	private String tsex;
	
	//集合Student
	private Set<Student> students=new HashSet<>();

	@Override
	public String toString() {
		return "Teacher [tid=" + tid + ", tname=" + tname + ", tsex=" + tsex + ", students=" + students + "]";
	}

	public Long getTid() {
		return tid;
	}

	public void setTid(Long tid) {
		this.tid = tid;
	}

	public String getTname() {
		return tname;
	}

	public void setTname(String tname) {
		this.tname = tname;
	}

	public String getTsex() {
		return tsex;
	}

	public void setTsex(String tsex) {
		this.tsex = tsex;
	}

	public Set<Student> getStudents() {
		return students;
	}

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

	public Teacher(Long tid, String tname, String tsex, Set<Student> students) {
		super();
		this.tid = tid;
		this.tname = tname;
		this.tsex = tsex;
		this.students = students;
	}

	public Teacher() {
		super();
		// TODO Auto-generated constructor stub
	}
	
	

}

Student.hbm.xml的配置

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    
    
    <hibernate-mapping>
    <class name="pojo.Student" table="student">
    
    	<id name="sid">
    	<generator class="native"/>
    	</id>
    	<property name="sname"/>
    	<property name="sgender"/>
    	
    	
    	<!--set  name当前对象的集合的属性   table:中间表的名字-->
    	<set name="teachers"  table="stu_teacher" inverse="false"   cascade="save-update,delete">
    	<!-- 表示当前对象 在中间中的外键 -->
    	<key column="sid"/>
    	<!-- 当前对象中的集合的类型Teacher   Teacher的全限定名-->
    	<many-to-many column="tid" class="pojo.Teacher" />

    	</set>
    	
    	
    </class>
    
    </hibernate-mapping>

Teacher.hbm.xml的配置

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    
    
    <hibernate-mapping>
    <class name="pojo.Teacher" table="teacher">
    
    	<id name="tid">
    	<generator class="native"/>
    	</id>
    	<property name="tname"/>
    	<property name="tsex"/>
    	
    	
    	<!--set  name当前对象的集合的属性   table:中间表的名字-->
	<set name="students"  table="stu_teacher" inverse="true" cascade="save-update,delete">
    	<!-- 表示当前对象 在中间中的外键 -->
    	<key column="tid"/>
    	<!-- 当前对象中的集合的类型Student在中间中的外键 和全限定名   Teacher的全限定名-->
    	<many-to-many column="sid" class="pojo.Student" />

    	</set>
    	
    	
    </class>
    
    </hibernate-mapping>
hibernate.cfg.xml只需要引入student和teacher的映射配置文件就好

 test类
//模拟一对多来实现保存学生和老师
	/**
	 * 多对多  保存数据  默认是双方都要维护外键      多对多必须要有一方来放弃对外键的维护 inverser="true"
	 * 多对多任意一方放弃对外键的维护 都可以
	 * 一般情况下:让哪一方来维护外键呢???  如果我们频繁操作学生,让学生来维护外键,老师就得放弃对外键的维护。
	 * 现在我存储学生来级联保存老师,学生维护外键,回去中间表里面插入数据;
	 * 这个时候保存老师来级联保存学生,这个时候,老师放弃对外键维护了,不会往中间表里面插入数据。
	 */
	@Test
	public void run1(){
		Session session = HibernateUtil.getCurrentSession();
		
		Transaction ts = session.beginTransaction();
		
		//
		Student s1=new Student();
		Student s2=new Student();
		
		Teacher t1=new Teacher();
		Teacher t2=new Teacher();
		
		s1.setSname("同学1");
		s2.setSname("同学2");
		
		
		t1.setTname("老师1");
		t2.setTname("老师2");
		
		//建立关系      同学1对应2个老师
		s1.getTeachers().add(t1);
		s1.getTeachers().add(t2);
		
		s2.getTeachers().add(t1);//同学2对应一个老师
		
		
		t1.getStudents().add(s1);
		t1.getStudents().add(s2);
		
		t2.getStudents().add(s1);
		

		session.save(t1);
		session.save(t2);
		session.save(s1);
		session.save(s2);
		

		ts.commit();
		
	}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值