【SSH三个框架】Hibernate第八部分基础:经营-many关系
在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关系的更多相关文章
- 【SSH三个框架】Hibernate第七基金会:不少下属业务
相对于上述一关系,在这里,下一个一对多关系说明. 另外,在上述.我们描述了许多人描述的一一对应关系.在关系数据库是多对一的关系,但也有许多关系.但,只知道它是不够的,Hibernate它是一种面向对象 ...
- 【SSH三个框架】Hibernate第十篇基础:inverse属性具体解释
inverse后经常用于双向1-N在相关性.它也可以在使用N-N该协会,这里,例如用双1-N联想 或两个与各部门及工作人员,两javabean没有写. 首先,我们的员工看映射文件: <?xml ...
- SSH三种框架及表示层、业务层和持久层的理解
Struts(表示层)+Spring(业务层)+Hibernate(持久层) SSH:Struts(表示层)+Spring(业务层)+Hibernate(持久层) Struts:Struts是一个表示 ...
- SSH三种框架及表示层、业务层和持久层的理解(转)
Struts(表示层)+Spring(业务层)+Hibernate(持久层) SSH:Struts(表示层)+Spring(业务层)+Hibernate(持久层) Struts:Struts是一个表示 ...
- 写了好多次SSH现在对于框架还是有一定的基础了,但是对于框架下我们该如何进行操作呢???
首先,对于一个老手来说,我们最快捷的就是ctrl+c和ctrl+v,但是我们自己应该复制哪一些代码呢? 1.在我们导完包之后,我们需要写的就是web.xml,在其中,我们要有过滤器及映射和监听器. w ...
- SSH整合时执行hibernate查询报错:java.lang.ClassCastException: com.ch.hibernate.Department_$$_javassist_0 cannot be cast to javassist.util.proxy
今天在整合ssh三个框架时,有一个功能,是查询所有员工信息,且员工表和部门表是多对一的映射关系,代码能正常运行到查询得到一个List集合,但在页面展示的时候,就报异常了, java.lang.Clas ...
- SSH整合时执行hibernate查询报错:java.lang.ClassCastException: com.ch.hibernate.Depart
今天在整合ssh三个框架时,有一个功能,是查询所有员工信息,且员工表和部门表是多对一的映射关系,代码能正常运行到查询得到一个List集合,但在页面展示的时候,就报异常了, java.lang.Clas ...
- Eclipse搭建SSH(Struts2+Spring+Hibernate)框架教程
| 版权声明:本文为博主原创文章,未经博主允许不得转载. 前言 确实,刚创博客,对于这个陌生的东西还是有些许淡然.这是我的第一篇博文,希望能给你们有帮助,这就是我最大的乐趣! 好了下面进入正题: SS ...
- SSH三作品的框架和流程
Hibernate工作的,为什么? 原理: 1.通过Configuration().configure();读取并解析hibernate.cfg.xml配置文件 2.由hibernate.cfg.xm ...
随机推荐
- SQL Server 2008 R2 性能计数器详细列表(四)
原文:SQL Server 2008 R2 性能计数器详细列表(四) SQL Server Latches 对象: 监视称为闩锁的内部 SQL Server 资源锁.通过监视闩锁来确定用户活动和资源使 ...
- java设计模式:观察者模式
package Observer; public class Test { /** * client测试类别 * 观察者模式一般由四部分组成: * 1摘要观察员(教科书被称为一般"Subje ...
- SGU 548 Dragons and Princesses
意甲冠军: n个月格儿 所有的格龙或公主的儿子 从勇士1走n 不杀 杀死有钱拿 路过公主 假设之前杀龙的数量满足公主要求就会停止行走 问 勇士想多拿钱 可是必需要满足n格子的公主 ...
- win8 64位使用plsql developer连接oracle数据库问题
问题:win8的64使用位系统plsql developer本地连接oracle莫名其妙的问题发生在数据库时.错误消息框,甚至可能是空的. 原因:它表示,互联网,的原因,预计在64位系统安装在64位O ...
- Maven学习笔记(四):协调和依赖
Maven协调具体的解释: Maven定义了这样一组规则:世界上不论什么一个构件都能够使用Maven坐标唯一标识.Maven坐标的元素包含groupId.artifactId.version ...
- js isArray小结
原文:[转载]js isArray小结 在日常开发中,我们经常需要判断某个对象是否是数组类型的,在js中检测对象类型的常见的方法有几种: 1.typeof操作符.对于Function.String.N ...
- H264 编解码器架构简单
看完后H264/AVC 编解码器演示,头脑是刚刚离开以下三个: 1.H264并且不明白如何指定的编解码器来实现,仅定义了一个编码视频位流的语法.和比特流进行解码,这与MPEG 类似. 2.H264而一 ...
- NYOJ 330 一个简单的数学
一个简单的数学题 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描写叙述 zyc近期迷上了数学,一天,dj想出了一道数学题来难住他.算出1/n,但zyc一时答不上来希望大家能 ...
- Cgroup maintainer丽泽范:解剖Linux核心容器技术
摘要:Cgroup和namespace等内核特性如何出现,在社区处于如何的开发状况?Docker如火如荼.内核社区是否会因此加紧完好容器技术的隔离性安全性?华为Linux内核高级project师李泽帆 ...
- SVN & Git (二)
Git:是一款免费.开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目. Git是一个开源的分布式版本控制系统,用以有效.高速的处理从很小到非常大的项目版本管理.Git 是 Linus T ...