【SSH三个框架】Hibernate第八部分基础:经营-many关系

在Hibernate在-many关系。它通常不使用。由于当数据库查询复杂度太高时。

我们在这里做的是学生和教师,学生可以有多个老师,教师可以有多个学生。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMDgwMDUzMA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" >

我们首先建立一个学生实体类:Student.java

package cn.itcast.hibernate.domain;

import java.util.Set;

public class Student {
	private int id;
	private String name;
	private Set<Teacher> teachers;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Set<Teacher> getTeachers() {
		return teachers;
	}
	public void setTeachers(Set<Teacher> teachers) {
		this.teachers = teachers;
	}
}

我们定义了三个三个属性。各自是id、name和一个set集合

然后是老师实体类:Teacher.java

package cn.itcast.hibernate.domain;

import java.util.Set;

public class Teacher {
	private int id;
	private String name;
	private Set<Student> students;
	public int getId() {
		return id;
	}
	public void setId(int 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;
	}
}

我们仍然定义了三个实体类,id、name和一个set集合

然后,我们看下Stduent类的映射文件:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping
    package="cn.itcast.hibernate.domain">
    <class name="Student">
        <id name="id">
            <generator class="native"/>
        </id>  

        <property name="name" />  

        <set name="teachers" table="teacher_student">
        	<key column="student_id" />
        	<many-to-many class="Teacher" column="teacher_id" />
        </set>
    </class>  

</hibernate-mapping>  

在这个文件里。我们定义了:id自己主动增长、name属性。另一个<set>标签。name属性是Student.java中的set集合的那个属性。然后我们在<key>标签定义外键是student_id,然后又定义了一个<many-to-many>标签,规定了多对多的关系。

下边是Teacher.java类的映射文件:

<?

xml version="1.0"?

>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping
    package="cn.itcast.hibernate.domain">
    <class name="Teacher">
        <id name="id">
            <generator class="native"/>
        </id>
        <property name="name" />
       	<set name="students" table="teacher_student">
       		<key column="teacher_id" />
       		<many-to-many class="Student"  column="student_id"/>
       	</set>
    </class>  

</hibernate-mapping>  

和上边的Stduent类的映射文件差点儿相同

然后,我们写一个測试类:Many2Many.java

package cn.itcast.hibernate;

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

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

import cn.itcast.hibernate.domain.Student;
import cn.itcast.hibernate.domain.Teacher;

public class Many2Many {
	public static void main(String[] args) {
		add();
		query(1);
	}

	static void add(){
		Session s = null;
		Transaction tx = null;
		try{
			//定义了一个Teahcer的set集合
			Set<Teacher> ts = new HashSet<Teacher>();
			//定义了一个Student的set集合
			Set<Student> ss = new HashSet<Student>();
			//添加一个老师1
			Teacher t1 = new Teacher();
			t1.setName("t1 name");
			ts.add(t1);
			//添加一个老师2
			Teacher t2 = new Teacher();
			t2.setName("t2 name");
			ts.add(t2);
			//添加一个学生1
			Student s1 = new Student();
			s1.setName("s1");
			ss.add(s1);
			//添加一个学生2
			Student s2 = new Student();
			s2.setName("s2");
			ss.add(s2);

			//这里是设置两个teacher的set属性
			t1.setStudents(ss);
			t2.setStudents(ss);

			/*
			 * 这是是设置两个student的set属性。假设和上边的设置同一时候出现,则会抛出异常。由于多对多的关系在上边已经建立
			 * s1.setTeachers(ts);
			   s2.setTeachers(ts);

			*/

			s = HibernateUtil.getSession();
			tx = s.beginTransaction();

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

			tx.commit();
		}finally{
			if(s!=null){
				s.close();
			}
		}
	}

	static void query(int id){
		Session s = null;
		Transaction tx = null;
		try{
			s = HibernateUtil.getSession();
			tx = s.beginTransaction();
			//依据id查询得到Teacher对象
			Teacher t = (Teacher) s.get(Teacher.class, id);
			//把Teacher对象相应的学生的数量打出来
			System.out.println("Students:"+t.getStudents().size());
			tx.commit();
		}finally{
			if(s!=null){
				s.close();
			}
		}
	}
}

版权声明:本文博客原创文章,博客,未经同意,不得转载。

时间: 2024-12-12 13:50:53

【SSH三个框架】Hibernate第八部分基础:经营-many关系的相关文章

Eclipse搭建SSH(Struts2+Spring+Hibernate)框架教程

| 版权声明:本文为博主原创文章,未经博主允许不得转载. 前言 确实,刚创博客,对于这个陌生的东西还是有些许淡然.这是我的第一篇博文,希望能给你们有帮助,这就是我最大的乐趣! 好了下面进入正题: SSH框架简介:①SSH框架是由struts2.spring.hibernate三大框架组合起来的一套总框架,一般来说这三个东西我们不会单独使用.  ②在学习SSH框架之前建议读者先学mvc,因为SSH是在mvc基础上根据mvc的缺点而产生的一套比较成熟的框架,也比较稳定.  ③SSH框架的流程:浏览器

SSH (Struts2+Spring+Hibernate)框架搭建

1.相关jar包下载地址:http://download.csdn.net/detail/harderxin/4420066 2.项目结构截图: 3.相关配置文件: (1)web.xml文件配置 <?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmln

Struts2+Hibernate+Spring(SSH)三大框架整合jar包

Struts2 + Spring3 + Hibernate3 框架整合 1. 每个框架使用 (开发环境搭建 )* 表现层框架 struts2 1) jar包导入: apps/struts2_blank.war 包含struts2 开发最基本的jar包 struts2-convention-plugin-2.3.7.jar用于struts使用注解 (如果不使用注解开发,无需导入) struts2-json-plugin-2.3.7.jar 用于struts2整合Ajax struts2-sprin

记2014年暑假,一个项目,三个框架

在开始动笔之际,看了下博文的标题,突然觉得欠妥,"记2014年暑假,一个项目,三个框架",既然是暑假说明还是学生,今年的6月我已经毕业了,但还在学习,并且在向一名合格的架构师狂奔.你说我矫情也好,做作也罢,现实就是这样的,厚着脸说:咱也矫情一回. 整个暑假,总共四十天,从7月中旬开始到8月底,从技术上看,整个假期都处于看视频,做项目,作总结的过程中,前二十天跟着视频做了DRP的项目,后二十天(到8月26日),看完了三个框架的视频,总结还在继续:从英语上看,这个假期是从听走向说的开始:从

hibernate(三)入手hibernate实例

对于框架,如何区分轻重量级? 在介绍我的小demo之前,我想来讨论下这个问题.现在当下的几个观点是 1.启动是耗费的系统资源多就是重量级 2.开发包很大就是重量级 3.对于程序的侵入性大就是重量级 对于第一个观点现在绝大部分主流还是这样认识的,但是有这样一个问题,spring在仅仅需要最低需求时,需要的jar是非常少的, 当然也是能实现基本功能的,启动耗费的资源也是很小,而如果要实现很多spring的功能就需要很多的资源和jar,这时候按照这个 观点来讲,它既是轻量级也是重量级,所以这个观点还是

持久层框架hibernate相关概念

hibernate为全自动的持久层框架(framework): 1.作用:把内存中的活跃对象永远的保存在关系型数据库中. 2.O/R/M原理:O-->object 对象,R---> relational关系型数据库,M--->mapping映射 为了解决应用程序中的对象和关系型数据库中的表的不匹配而提出的一个解决方案. 3.新版本hibernate4中怎么得到session工厂从而创建连接对象 Configuration cfg = new Configuration().configu

条理清晰的搭建SSH环境之整合Hibernate和Spring

上篇博客整合了Struts和Spring,感觉很简单,这篇博客主要讲述Hibernate和Spring的整合. 如果说上篇博客中的整合是以为Spring的IOC可以管理对象,让Struts2里的对象管理变得更方便.那么Hibernate与Spring的整合的好处就是,可以将SessionFactory的实例交由Spring容器管理,那么我们只需要这一个实例就可以了.还有一点就是声明式的事务管理非常方便. 需要以下配置: 1.配置applicationContext.xml文件,添加配置sessi

【SSH快速进阶】——Hibernate继承映射:每个类映射一张表

上文说了每棵继承树映射一张表,本文继续描述让每个类都映射一张表的配置. 场景 与上篇文章场景一样,如下类图 上图中Pig类和Bird类继承Animal类,要让每个类映射一张表,就是让着三个类都分别映射一张表,但同时这三张表也跟对应的三个类似的,有继承关系,如下表所示: (表 1) Pig和Bird的记录都表示一个动物,因此都会在Animal对应的表中存储,而它们各自的拓展属性则存储在各自对应的表中,主键与Animal对应记录的主键各自对应. 配置 PO对象 跟上篇文章一样,实体类没有任何变化.

【SSH快速进阶】——Hibernate继承映射:每棵继承树映射一张表

我们都知道,Hibernate最大的一个优点就是使开发更加"面向对象",类与类之间有继承关系,Hibernate中也对这种继承关系提供了映射的封装. Hibernate为继承映射提供了三种策略 1.每棵继承树使用一张表 2.每个子类使用一张表 3.每个具体类使用一张表 本文对第一种策略进行说明. 场景 如下类图 上图中Pig类和Bird类继承Animal类,每棵继承树对应一张表,即在同一棵继承树中,所有的类的对象信息(记录)共同存放到一张表中,要判断某条记录属于哪个对象,需要在表中添加