hibernate学习笔记(多对多关联关系)

多对多关联关系:本质上就是两个一对多的关系,

例如:一个学生可以选择多门课程。一门课程可以被很多学生选择。

体现在代码中如下;学生类:

	private String id;//学生id
	private String name;//学生姓名
	private Set<Course> course;//学生选择的课程集合
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Set<Course> getCourse() {
		return course;
	}
	public void setCourse(Set<Course> course) {
		this.course = course;
	}
课程类:

	private String id;//课程id
	private String name;//课程名称
	private Set<Student> student;//学生集合
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Set<Student> getStudent() {
		return student;
	}
	public void setStudent(Set<Student> student) {
		this.student = student;
	}
关键就是两个映射文件了。

student.hbm.xml映射文件

	<class name="com.test.bean1.Student" table="student">
		<id name="id" column="id" type="string">
			<generator class="uuid"/>
		</id>
		<property name="name" column="name" type="string"/>
		<set name="course" table="student_course" cascade="save-update" >
			<key column="student_id"/><!-- 这个student_id是中间关联表的id,根据这个id可以关联到student表 -->
			<!-- class:表示关联的类型。column:表示根据course_id可以关联到course表 -->
			<many-to-many class="com.test.bean1.Course" column="course_id" />
		</set>
	</class>
course.hbm.xml映射文件;

<class name="com.test.bean1.Course" table="course">
		<id name="id" column="id" type="string">
			<generator class="uuid"/>
		</id>
		<property name="name" column="name" type="string"/>
		<!-- 这里的配置和上面的一样,有一点就是inverse为true;表示对方维护这种关联关系。为false:表示主动方;由主动方维护这种关联关系 -->
		<set name="student" table="student_course" cascade="save-update" inverse="true" >
			<key column="course_id"/>
			<many-to-many class="com.test.bean1.Student" column="student_id"  />
		</set>
	</class>
最后来个测试吧:

		Session session=sessionfactory.openSession();
		Transaction tx=null;
//		Student student=new Student();
//		student.setName("zhangsan");
//		student.setCourse(new HashSet<Course>());
//		
//		Course course=new Course();
//		course.setName("英语");
//		course.setStudent(new HashSet<Student>());
//		//添加记录
//		student.getCourse().add(course);
//		course.getStudent().add(student);
//		
		try {
			tx=session.beginTransaction();
			//查询到张三学生。没用延迟加载。所以把对应的课程表的信息也查出来了。
			Student student=(Student)session.get(Student.class, "4028ab81385bdd9b01385bdd9d030001");
			//查询到数学这门课程
//			Course course=(Course)session.get(Course.class, "4028ab81385be0c001385be0c2db0002");
			//删除信息
//			student.getCourse().remove(course);
			
			//已经查询到了张三的信息。和数学课程的信息。所以可以讲数学这门课程让张三选中
//			student.getCourse().add(course);
//			course.getStudent().add(student);
			
			//遍历张三学生的所选课程
			Set<Course> course=student.getCourse();
			for(Iterator<Course> iter=course.iterator();iter.hasNext();){
				System.out.println(iter.next().getName());
			}
			tx.commit();
		} catch (Exception e) {
			if(null!=tx)
				tx.rollback();
			e.printStackTrace();
		}finally{
			session.close();
		}
省略了获取session的代码了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值