以Classes[班级]和Student[学生]为例的Demo

//Classes.java
public class Classes implements Serializable {
private long cid;
private String cname;
private String cdesc;
private Set<Student> students;
//get和set }
//Student .java

public class Student implements Serializable {
private long sid;
private String sname;
private String sdesc;
private Classes classes; //get和set
}
 <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="cn.test.testDoubl.Classes" >
<id name="cid" type="java.lang.Long" length="5">
<column name="cid"></column>
<generator class="increment"></generator>
</id>
<property name="cname" type="java.lang.String" length="20"></property>
<property name="cdesc" type="java.lang.String" length="50"></property>
<!--
cascade指的是对象对对象的操作
inverse指的是对象对关系的操作
-->
<set name="students" cascade="all">
<key>
<!--
通过classes建立与student之间的联系
-->
<column name="cid"></column>
</key>
<one-to-many class="cn.test.testDoubl.Student"/>
</set>
</class>
</hibernate-mapping>
 <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="cn.test.testDoubl.Student">
<id name="sid" type="java.lang.Long" length="5">
<column name="sid"></column>
<generator class="increment"></generator>
</id>
<property name="sname" type="java.lang.String" length="20"></property>
<property name="sdesc" type="java.lang.String" length="50"></property>
<!--
多对一
注意:在many-to-one中没有inverse属性
对student表的修改本身就是维护外键
-->
<many-to-one name="classes" class="cn.test.testDoubl.Classes" cascade="all">
<!--
外键
描述了通过student建立与classes之间的联系
-->
<column name="cid"></column>
</many-to-one>
</class>
</hibernate-mapping>

 总结:

当发生transaction.commit的时候,hibernate内部会检查所有的持久化对象 会对持久化对象做一个更新,因为classes是一个持久化状态的对象,所以hibernate   内部要对classes进行更新,因为在classes.hbm.xml文件中<set name="students" cascade="all" inverse="true"> 意味着在更新classes的时候,要级联操作student,而student是一个临时状态的对象 所以要对student进行保存,在保存student的时候,就把外键更新了。

 package cn.test.testDoubl;

 import java.util.HashSet;
import java.util.Set; import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test; public class DoTestDoubl {
private static SessionFactory sessionFactory;
static{
Configuration configuration=new Configuration();
configuration.configure("cn/test/testDoubl/hibernate.cfg.xml");
sessionFactory=configuration.buildSessionFactory();
} /**
* 1、保存班级
* 2、保存学生
* 3、保存班级的时候同时保存学生
* 4、保存班级的时候同时保存学生,并且建立班级和学生之间的关系
* 5、已经存在一个班级,新建一个学生,并且建立该学生和该班级之间的关系
* 6、已经存在一个学生,新建一个班级,并且建立该学生和该班级之间的关系
* 7、已经存在一个学生,已经存在一个班级,解除该学生和原来班级之间的关系,建立该学生和新班级之间的关系
* 8、已经存在一个学生,解除该学生和该学生所在班级之间的关系
* 9、解除该班级和所有的学生之间的关系,再重新建立该班级和一些新的学员之间的关系
* 10、解除该班级和所有的学生之间的关系
* 11、删除班级
* *
* * 解除该班级和所有的学生之间的关系
* * 删除该班级
* *
* 删除班级的同时删除学生
* 12、删除学生
* 同删除班级
*/ //3、保存班级的时候同时保存学生
/*
* Hibernate: select max(cid) from Classes
Hibernate: select max(sid) from Student
Hibernate: insert into Classes (cname, cdesc, cid) values (?, ?, ?)
Hibernate: insert into Student (sname, sdesc, cid, sid) values (?, ?, ?, ?)
Hibernate: update Student set cid=? where sid=?
*/ @Test
public void testSaveClassesandStudent(){ Session session=sessionFactory.openSession();
Transaction transaction=session.beginTransaction();
Student student=new Student();
student.setSname("1111");
student.setSdesc("111111111111"); Set<Student> set=new HashSet<Student>();
set.add(student); Classes classes=new Classes();
classes.setCname("oo1");
classes.setCdesc("我们都是No。1"); classes.setStudents(set); session.save(classes); transaction.commit();
session.close(); } //4、保存班级的时候同时保存学生,并且建立班级和学生之间的关系
/*
* Hibernate: select max(sid) from Student
Hibernate: select max(cid) from Classes
Hibernate: insert into Classes (cname, cdesc, cid) values (?, ?, ?)
Hibernate: insert into Student (sname, sdesc, cid, sid) values (?, ?, ?, ?)
*/
@Test
public void testSaveClassesandStudent2(){ Session session=sessionFactory.openSession();
Transaction transaction=session.beginTransaction(); Student student=new Student();
student.setSname("1111");
student.setSdesc("111111111111"); Classes classes=new Classes();
classes.setCname("oo1");
classes.setCdesc("我们都是No。1"); student.setClasses(classes);//通过student来维护classes
//对student的增、删、改本身就是对外键的操作,所以这里不再发出update语句
//一对多,多的一方维护关系,效率比较高 session.save(student); transaction.commit();
session.close(); } //5、已经存在一个班级,新建一个学生,并且建立该学生和该班级之间的关系
/*
* Hibernate: select classes0_.cid as cid0_0_, classes0_.cname as cname0_0_, classes0_.cdesc as cdesc0_0_ from Classes classes0_ where classes0_.cid=?
Hibernate: select max(sid) from Student
Hibernate: insert into Student (sname, sdesc, cid, sid) values (?, ?, ?, ?)
*/
@Test
public void testSaveStudentToClasses(){
Session session =sessionFactory.openSession();
Transaction transaction=session.beginTransaction(); Classes classes=(Classes) session.get(Classes.class, 1L); Student student=new Student();
student.setSname("王尼玛");
student.setSdesc("暴走漫画,就是劲爆");
student.setClasses(classes); session.save(student); transaction.commit();
session.close();
} //6、已经存在一个学生,新建一个班级,并且建立该学生和该班级之间的关系
/*
* Hibernate: select student0_.sid as sid1_0_, student0_.sname as sname1_0_, student0_.sdesc as sdesc1_0_, student0_.cid as cid1_0_ from Student student0_ where student0_.sid=?
Hibernate: select max(cid) from Classes
Hibernate: insert into Classes (cname, cdesc, cid) values (?, ?, ?)
Hibernate: update Student set sname=?, sdesc=?, cid=? where sid=?
*/
@Test
public void testSaveClassesToStudent(){
Session session=sessionFactory.openSession();
Transaction transaction=session.beginTransaction(); Student student=(Student) session.get(Student.class, 1L); Classes classes=new Classes();
classes.setCname("黑客集训");
classes.setCdesc("里面都是牛人"); student.setClasses(classes); session.save(classes); transaction.commit();
session.close();
} //7、已经存在一个学生,已经存在一个班级,解除该学生和原来班级之间的关系,建立该学生和新班级之间的关系
/*
* Hibernate: select classes0_.cid as cid0_0_, classes0_.cname as cname0_0_, classes0_.cdesc as cdesc0_0_ from Classes classes0_ where classes0_.cid=?
Hibernate: select student0_.sid as sid1_0_, student0_.sname as sname1_0_, student0_.sdesc as sdesc1_0_, student0_.cid as cid1_0_ from Student student0_ where student0_.sid=?
Hibernate: update Student set sname=?, sdesc=?, cid=? where sid=?
*/
@Test
public void testToRebuild(){
Session session=sessionFactory.openSession();
Transaction transaction=session.beginTransaction(); Classes classes=(Classes) session.get(Classes.class, 1L);
Student student=(Student) session.get(Student.class, 1L);
student.setClasses(classes);
transaction.commit();
session.close();
} //8、已经存在一个学生,解除该学生和该学生所在班级之间的关系
/*
* Hibernate: select student0_.sid as sid1_0_, student0_.sname as sname1_0_, student0_.sdesc as sdesc1_0_, student0_.cid as cid1_0_ from Student student0_ where student0_.sid=?
Hibernate: update Student set sname=?, sdesc=?, cid=? where sid=?
*/
@Test
public void testToRomove(){
Session session=sessionFactory.openSession();
Transaction transaction=session.beginTransaction(); Student student=(Student) session.get(Student.class, 1L);
student.setClasses(null); transaction.commit();
session.close();
} //9、解除该班级和所有的学生之间的关系,再重新建立该班级和一些新的学员之间的关系
/*
* Hibernate: select classes0_.cid as cid0_0_, classes0_.cname as cname0_0_, classes0_.cdesc as cdesc0_0_ from Classes classes0_ where classes0_.cid=?
Hibernate: select students0_.cid as cid0_1_, students0_.sid as sid1_, students0_.sid as sid1_0_, students0_.sname as sname1_0_, students0_.sdesc as sdesc1_0_, students0_.cid as cid1_0_ from Student students0_ where students0_.cid=?
Hibernate: select max(sid) from Student
Hibernate: insert into Student (sname, sdesc, cid, sid) values (?, ?, ?, ?)
Hibernate: insert into Student (sname, sdesc, cid, sid) values (?, ?, ?, ?)
Hibernate: update Student set sname=?, sdesc=?, cid=? where sid=?
Hibernate: update Student set sname=?, sdesc=?, cid=? where sid=?
Hibernate: update Student set sname=?, sdesc=?, cid=? where sid=?
Hibernate: update Student set sname=?, sdesc=?, cid=? where sid=?
Hibernate: update Student set cid=? where sid=?
Hibernate: update Student set cid=? where sid=?
*/
@Test
public void testremoveAndRebuild(){
Session session=sessionFactory.openSession();
Transaction transaction=session.beginTransaction(); Classes classes=(Classes) session.get(Classes.class, 2L);
Set<Student> students=classes.getStudents();
for(Student student:students)
{
student.setClasses(null);
} Student student=new Student();
student.setSname("新建1");
student.setSdesc("新建轩辕rtyuio");
Student student2=new Student();
student2.setSname("新建2");
student2.setSdesc("新建轩sdfghyujikol;辕rtyuio"); students.add(student);
students.add(student2); transaction.commit();
session.close();
} //10、解除该班级和所有的学生之间的关系
@Test
public void testRemoveAllStudents(){
Session session=sessionFactory.openSession();
Transaction transaction=session.beginTransaction(); Classes classes=(Classes) session.get(Classes.class, 2L);
Set<Student> students= classes.getStudents();
for(Student student:students){
student.setClasses(null);
}
transaction.commit();
session.close();
} //11、删除班级
//先解除关系,再删除班级
@Test
public void testDeleteClasses(){
Session session=sessionFactory.openSession();
Transaction transaction=session.beginTransaction(); Classes classes=(Classes) session.get(Classes.class, 1L);
Set<Student> set=classes.getStudents();
for(Student student:set){
student.setClasses(null);
}
session.delete(classes);
transaction.commit();
session.close();
} //在删除班级的时候,同时删除整个班级的学生 @Test
public void testDeleteClasses2(){
Session session=sessionFactory.openSession();
Transaction transaction=session.beginTransaction(); Classes classes=(Classes) session.get(Classes.class, 2L);
Set<Student> set=classes.getStudents();
for(Student student:set){
student.setClasses(null);
break;
}
//session.delete(classes);
transaction.commit();
session.close();
} }

一对多双向关联例子

Hibernate 一对多双向关联Demo的更多相关文章

  1. hibernate 一对多双向关联 详解

    一.解析: 1.  一对多双向关联也就是说,在加载班级时,能够知道这个班级所有的学生. 同时,在加载学生时,也能够知道这个学生所在的班级. 2.我们知道,一对多关联映射和多对一关联映射是一样的,都是在 ...

  2. Hibernate 一对多单向关联Demo

    以Classes[班级]和Student[学生]为例的Demo Classes .java public class Classes implements Serializable { private ...

  3. 15.Hibernate一对多双向关联映射+分页

    1.创建如下数据库脚本 --创建用户信息表 --编号,用户名,密码,年龄,性别,昵称,手机,地址,管理员,图像地址 create table users ( id ) primary key, use ...

  4. Hibernate一对多双向关联映射

    建立多对一的单向关联关系    Emp.java            private Integer empNo //员工编号            private String empName / ...

  5. Hibernate从入门到精通(九)一对多双向关联映射

    上次的博文Hibernate从入门到精通(八)一对多单向关联映射中,我们讲解了一下一对多单向映射的相关内容,这次我们讲解一下一对多双向映射的相关内容. 一对多双向关联映射 一对多双向关联映射,即在一的 ...

  6. Hibernate(九)一对多双向关联映射

    上次的博文Hibernate从入门到精通(八)一对多单向关联映射中,我们讲解了一下一对多单向映射的相关 内容,这次我们讲解一下一对多双向映射的相关内容. 一对多双向关联映射 一对多双向关联映 射,即在 ...

  7. Hibernate一对多单向关联和双向关联映射方法及其优缺点 (待续)

    一对多关联映射和多对一关联映射实现的基本原理都是一样的,既是在多的一端加入一个外键指向一的一端外键,而主要的区别就是维护端不同.它们的区别在于维护的关系不同: 一对多关联映射是指在加载一的一端数据的同 ...

  8. Hibernate中用注解配置一对多双向关联和多对一单向关联

    Hibernate中用注解配置一对多双向关联和多对一单向关联 Hibernate提供了Hibernate Annotations扩展包,使用注解完成映射.在Hibernate3.3之前,需单独下载注解 ...

  9. hibernate多对一双向关联

    关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...

随机推荐

  1. 五种I/O 模式——阻塞(默认IO模式),非阻塞(常用语管道),I/O多路复用(IO多路复用的应用场景),信号I/O,异步I/O

    五种I/O 模式——阻塞(默认IO模式),非阻塞(常用语管道),I/O多路复用(IO多路复用的应用场景),信号I/O,异步I/O 五种I/O 模式:[1]        阻塞 I/O          ...

  2. 实战weblogic集群之创建domain,AdminServer

    在weblogic安装完后,接下来就可以创建domain,AdminSever了. 第1步: $ cd /app/sinova/Oracle/wlserver_10./common/bin $ ./c ...

  3. 数据结构(括号序列,线段树||点分治,堆):ZJOI 2007 捉迷藏

    [题目描述] Jiajia和Wind是一对恩爱的夫妻,并且他们有很多孩子.某天,Jiajia.Wind和孩子们决定在家里玩捉迷藏游戏.他们的家很大且构造很奇特,由N个屋子和N-1条双向走廊组成,这N- ...

  4. DIV+CSS布局问题:一个宽度不确定的DIV里面放三个水平对齐的DIV,左右两个DIV宽度固定为150px,中间那个DIV充满剩余的宽度

    一个入门的DIV+CSS布局问题:一个宽度不确定的DIV里面放三个水平对齐的DIV,左右两个DIV宽度固定为150px,中间那个DIV充满剩余的宽度. 说明:代码非真实情况下使用,所以直接简单. 没耐 ...

  5. 迭代加深搜索算法总结 + Editing a Book UVa11212题解

    迭代加深搜索算法: 对于可以用回溯法解决,但是解答树结点数大的恐怖的问题的一种解决办法,有的问题甚至用bfs连一层节点都遍历不完就超时了.具体方法就是依次枚举搜索层数,从1到一个上限. 结构: int ...

  6. python 解析xml 文件: DOM 方式

    环境 python:3.4.4 准备xml文件 首先新建一个xml文件,countries.xml.内容是在python官网上看到的. <?xml version="1.0" ...

  7. Xcode7连接网络设置

    XCode7连接互联网的时候需要再info.plist设置(之前版本都不需要)连接网络NSAppTransportSecurity  字典NSAllowsArbitraryLoads    布尔  Y ...

  8. TCP具体解释(3):重传、流量控制、拥塞控制……

    传输数据 在TCP的数据传送状态.非常多重要的机制保证了TCP的可靠性和强壮性.它们包括:使用序号.对收到的TCP报文段进行排序以及检測反复的数据:使用校验和来检測报文段的错误.使用确认和计时器来检測 ...

  9. win32下进程间通信——共享内存

    一.引言     在Windows程序中,各个进程之间常常需要交换数据,进行数据通讯.WIN32 API提供了许多函数使我们能够方便高效的进行进程间的通讯,通过这些函数我们可以控制不同进程间的数据交换 ...

  10. javascript 鼠標拖動功能

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...