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

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

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

我们首先建立一个学生实体类: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();
}
}
}
}

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

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

  1. 【SSH三个框架】Hibernate第七基金会:不少下属业务

    相对于上述一关系,在这里,下一个一对多关系说明. 另外,在上述.我们描述了许多人描述的一一对应关系.在关系数据库是多对一的关系,但也有许多关系.但,只知道它是不够的,Hibernate它是一种面向对象 ...

  2. 【SSH三个框架】Hibernate第十篇基础:inverse属性具体解释

    inverse后经常用于双向1-N在相关性.它也可以在使用N-N该协会,这里,例如用双1-N联想 或两个与各部门及工作人员,两javabean没有写. 首先,我们的员工看映射文件: <?xml ...

  3. SSH三种框架及表示层、业务层和持久层的理解

    Struts(表示层)+Spring(业务层)+Hibernate(持久层) SSH:Struts(表示层)+Spring(业务层)+Hibernate(持久层) Struts:Struts是一个表示 ...

  4. SSH三种框架及表示层、业务层和持久层的理解(转)

    Struts(表示层)+Spring(业务层)+Hibernate(持久层) SSH:Struts(表示层)+Spring(业务层)+Hibernate(持久层) Struts:Struts是一个表示 ...

  5. 写了好多次SSH现在对于框架还是有一定的基础了,但是对于框架下我们该如何进行操作呢???

    首先,对于一个老手来说,我们最快捷的就是ctrl+c和ctrl+v,但是我们自己应该复制哪一些代码呢? 1.在我们导完包之后,我们需要写的就是web.xml,在其中,我们要有过滤器及映射和监听器. w ...

  6. SSH整合时执行hibernate查询报错:java.lang.ClassCastException: com.ch.hibernate.Department_$$_javassist_0 cannot be cast to javassist.util.proxy

    今天在整合ssh三个框架时,有一个功能,是查询所有员工信息,且员工表和部门表是多对一的映射关系,代码能正常运行到查询得到一个List集合,但在页面展示的时候,就报异常了, java.lang.Clas ...

  7. SSH整合时执行hibernate查询报错:java.lang.ClassCastException: com.ch.hibernate.Depart

    今天在整合ssh三个框架时,有一个功能,是查询所有员工信息,且员工表和部门表是多对一的映射关系,代码能正常运行到查询得到一个List集合,但在页面展示的时候,就报异常了, java.lang.Clas ...

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

    | 版权声明:本文为博主原创文章,未经博主允许不得转载. 前言 确实,刚创博客,对于这个陌生的东西还是有些许淡然.这是我的第一篇博文,希望能给你们有帮助,这就是我最大的乐趣! 好了下面进入正题: SS ...

  9. SSH三作品的框架和流程

    Hibernate工作的,为什么? 原理: 1.通过Configuration().configure();读取并解析hibernate.cfg.xml配置文件 2.由hibernate.cfg.xm ...

随机推荐

  1. hadoop编程小技巧(7)---自己定义输出文件格式以及输出到不同文件夹

    代码測试环境:Hadoop2.4 应用场景:当须要定制输出数据格式时能够採用此技巧,包含定制输出数据的展现形式.输出路径.输出文件名称称等. Hadoop内置的输出文件格式有: 1)FileOutpu ...

  2. myeclipse egit 安装失败 org.eclipse.e4.ui.css.swt.theme 0.0.0

    [前言] 首先确保您可能会被安装在阅读本文之前,myeclipse egit, 见文章:http://blog.csdn.net/uikoo9/article/details/17247405 事实上 ...

  3. latex如何输入正确的 双引号

    latex当输入双引号,假设直接用双引号键在键盘上.玩过顺-handed. 引述左输入法是正确的:按两次"Tab在之上,数字1左边的键".至于后面行情,该方法是一样的老,这是两次单 ...

  4. S3C2416裸机开发系列19_Fatfs播放录像wav音频文件

    S3C2416裸机开发系列19 Fatfs播放录像wav音频文件 国际象棋男孩    1048272975 多媒体资源,一般都是以文件的形式存储在固化存储器中.Fatfs所支持的fat32为windo ...

  5. 在win8.1 64位系统+cocos2d-x2.2.3下搭建android交叉编译环境

    搭建前须要下载的软件包(默认已搭建好cocos2d-x而且可在VS上执行,本人VS版本号为2013): 1:java 下载地址:http://www.java.com/zh_CN/download/m ...

  6. Ruby 一些经常使用的细节

    1.try 永远不会抛出异常 在 没有的时候 返回 nil province_id = Province.find_by_name(prov).try(:id) 2.find(:first, :con ...

  7. MIFARE系列7《安全》

    飞利浦的MIFARE卡因为它的高安全性在市场上得到广泛应用,比方我们乘车用的公交卡,学校和企业食堂的饭卡等等.它每一个扇区有独立的密匙(6个字节的password),在通信过程中首先要验证密匙才干读写 ...

  8. JS如何判断包括IE11在内的IE浏览器

    原文:JS如何判断包括IE11在内的IE浏览器 今天碰到一个奇怪的问题,有一个页面,想指定用IE浏览器打开,在VS开发环境没有问题,但部署到服务器上,即使是用IE打开页面,还是提示"仅支持I ...

  9. httppost body的实现, 和body是gb2312等编码的实现

    使用的是http4.X 版本,里面推荐使用的post是key value的形式 List<NameValuePair> formparams = new ArrayList<Name ...

  10. hdu1286 寻找新朋友 (欧拉功能)

    原标题:点击打开链接 关于欧拉函数的算法具体解说:点击打开链接 欧拉函数 1.欧拉函数是不全然积性函数. 2.欧拉函数p(x) = x * (p1 - 1) / p1 * (p2 - 1)/p2 * ...