Hibernate中的表的多对多关系及操作

表的多对多关系及操作

多对多的表关系表达

表:
使用中间表,分别引用两方的ID
对象: 
两方都使用集合表达
配置:
<set name="courses" table="t_student_course"  >
<key column="sid" ></key>
<many-to-many class="Course" column="cid" ></many-to-many>
</set>

操作:
inverse: 我是否要放弃维护外键关系
cascade: 是否需要级联操作 (5个)
注意: 配置级联删除时,要小心,双方都配置级联删除, 任意删除一条记录, 整个关系链数据都会被删除.


多对多的对象关系表达

配置:

Student:
package com.hcx.domain;

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

public class Student {
	private Integer id;
	private String name;
	
	private Set<Course> courses = new HashSet<Course>();

	public Integer getId() {
		return id;
	}

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

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Set<Course> getCourses() {
		return courses;
	}

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


}

 
 
Course:
package com.hcx.domain;

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

public class Course {
	private Integer id;
	private String name;
	
	private Set<Student> students = new HashSet<Student>();

	public Integer getId() {
		return id;
	}

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

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

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

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

}

 
 
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">
    <!-- ORM元数据  表对象关系映射文件 
    	package : 配置该配置文件中类所在的包.  -->
 <hibernate-mapping package="com.hcx.domain" >
 	<class name="Student" table="t_student"   >
		<id name="id" column="id"    >
			<generator class="native"></generator>
		</id> 	
		<property name="name" column="name" ></property>
		
		<!-- 多对多关系 -->
		<!-- 
			set 表达集合
				name: 集合的属性名
				table:多对多中间表的表名
			key 表达外键
				column:引用我的外键名
			many-to-many 表达多对多
				class : 集合引用方的类型
				column:对方在中间表的外键名
		 -->
		<set name="courses" table="t_student_course" inverse="false" cascade="save-update"  >
			<key column="sid" ></key>
			<many-to-many class="Course" column="cid" ></many-to-many>
		</set>
	
 	</class>
 </hibernate-mapping>

 
 
Course.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">
    <!-- ORM元数据  表对象关系映射文件 
    	package : 配置该配置文件中类所在的包.  -->
 <hibernate-mapping package="com.hcx.domain" >
 	<class name="Course" table="t_course"  >
		<id name="id" column="id"    >
			<generator class="native"></generator>
		</id> 	
		<property name="name" column="name" ></property>
		
		<set name="students" table="t_student_course" inverse="true" >
			<key column="cid" ></key>
			<many-to-many class="Student" column="sid"  ></many-to-many>
		</set>
 	</class>
 </hibernate-mapping>

 

操作:

package com.hcx.a_manytomany;

import org.hibernate.Session;
import org.junit.Test;

import com.hcx.domain.Course;
import com.hcx.domain.Student;
import com.hcx.utils.HibernateUtils;

public class Demo {
	@Test
	//保存学生 => 通过学生保存课程. 由学生维护外键
	//Student 的
		//inverse =  false
		//cascade =  save-update
	//Course
		//inverse = true
	public void fun1(){
		Session session = HibernateUtils.openSession();
		session.beginTransaction();
		//------------------------------------------------
		Student stu1 = new Student();
		stu1.setName("tom");
		
		Student stu2 = new Student();
		stu2.setName("jerry");
		
		Course c1 = new Course();
		c1.setName("Struts2");
		
		Course c2 = new Course();
		c2.setName("Hibernate");
		
		Course c3 = new Course();
		c3.setName("Spring");
		
		stu1.getCourses().add(c1); //维护关系,级联保存
		stu1.getCourses().add(c2);
		stu1.getCourses().add(c3);

		stu2.getCourses().add(c1);
		stu2.getCourses().add(c2);
		stu2.getCourses().add(c3);
		
		session.save(stu1);
		session.save(stu2);
		//------------------------------------------------
		session.getTransaction().commit();
		session.close(); // 游离状态
	}
	
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值