以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;
//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.test.Classes" table="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> <!--
set元素和类中的set集合对应
* 从外键的角度建立classes与student之间的关系
* 从类与类的角度建立classes与student之间的关系
cascade级联
inverse是用来维护关系的
* 要么是一对多的关系
* 要么多对多的关系
* 谁来维护关系
inverse所在的映射文件对应的持久化对象维护关系
默认值是false 表明维护关系
true 表明不维护关系
-->
<set name="students" cascade="all">
<!--
key是用来描述外键
column就代表外键的名字
-->
<key>
<column name="Cid"></column>
</key>
<!--
classes和哪个对象进行关联
-->
<one-to-many class="cn.test.test.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.test.Student" table="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>
</class>
</hibernate-mapping>
 package cn.test.test;

 import java.util.HashSet;
import java.util.List;
import java.util.Set; import javax.crypto.interfaces.PBEKey; import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test; public class DoTest {
/**
* 1、保存班级
* 2、保存学生
* 3、保存班级的时候同时保存学生
* 4、保存班级的时候同时保存学生,并且建立班级和学生之间的关系
* 5、已经存在一个班级,新建一个学生,并且建立该学生和该班级之间的关系
* 6、已经存在一个学生,新建一个班级,并且建立该学生和该班级之间的关系
* 7、已经存在一个学生,已经存在一个班级,解除该学生和原来班级之间的关系,建立该学生和新班级之间的关系
* 8、已经存在一个学生,解除该学生和该学生所在班级之间的关系
* 9、解除该班级和所有的学生之间的关系,再重新建立该班级和一些新的学员之间的关系
* 10、解除该班级和所有的学生之间的关系
* 11、删除班级
* *
* * 解除该班级和所有的学生之间的关系
* * 删除该班级
* *
* 删除班级的同时删除学生
* 12、删除学生
* 同删除班级
*/ private static SessionFactory sessionFactory;
static{
Configuration configuration=new Configuration();
configuration.configure();
sessionFactory=configuration.buildSessionFactory();
} //1、保存班级
@Test
public void testSaveClasses(){
Session session=sessionFactory.openSession();
Transaction transaction= session.beginTransaction();
Classes classes=new Classes();
classes.setCname("Tom");
classes.setCdesc("1234567890-");
session.save(classes);
transaction.commit();
session.close();
}
//2、保存学生
@Test
public void testSaveStudents(){
Session session=sessionFactory.openSession();
Transaction transaction= session.beginTransaction();
Student student=new Student();
student.setSname("屌丝班");
student.setSdesc("都是纯逗比纯屌丝");
session.save(student);
transaction.commit();
session.close();
}
//3、保存班级的时候同时保存学生
/*
* Hibernate: select max(Sid) from student
Hibernate: select max(Cid) from classes
Hibernate: insert into student (Sname, Sdesc, Sid) values (?, ?, ?)
Hibernate: insert into classes (Cname, Cdesc, Cid) values (?, ?, ?)
*/
@Test
public void testSaveClasses_Students(){
Session session=sessionFactory.openSession();
Transaction transaction= session.beginTransaction(); Student student=new Student();
student.setSname("屌丝班");
student.setSdesc("都是纯逗比纯屌丝");
session.save(student); Classes classes=new Classes();
classes.setCname("Tom");
classes.setCdesc("1234567890-");
session.save(classes); transaction.commit();
session.close();
} //4、保存班级的时候同时保存学生,并且建立班级和学生之间的关系
/*classes.hbm.xml中设置;<set name="students" cascade="save-update">
* 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, Sid) values (?, ?, ?)
Hibernate: update student set Cid=? where Sid=? 保存班级的时候同时保存学生,并且建立班级和学生之间的关系
* 在classes.hbm.xml文件中
* <set name="students" cascade="save-update">
* inverse的值为默认或者false,才能让classes维护student的关系
设置<set name="students" cascade="save-update" inverse="true">
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, Sid) values (?, ?, ?)
不建立关联
*/
@Test
public void testSaveClasses_R_Students(){
Session session=sessionFactory.openSession();
Transaction transaction= session.beginTransaction(); Student student=new Student();
student.setSname("Tom");
student.setSdesc("1234567890-"); //session.save(student);必须删除掉 Set<Student> students=new HashSet<Student>();
students.add(student); Classes classes=new Classes();
classes.setCname("屌丝班");
classes.setCdesc("都是纯逗比纯屌丝"); classes.setStudents(students); session.save(classes); transaction.commit();
session.close();
} //5、已经存在一个班级,新建一个学生,并且建立该学生和该班级之间的关系
/**
* Hibernate: select classes0_.Cid as Cid1_0_, classes0_.Cname as Cname1_0_, classes0_.Cdesc as Cdesc1_0_ from classes classes0_ where classes0_.Cid=?
Hibernate: select students0_.Cid as Cid1_1_, students0_.Sid as Sid1_, students0_.Sid as Sid0_0_, students0_.Sname as Sname0_0_, students0_.Sdesc as Sdesc0_0_ from student students0_ where students0_.Cid=?
Hibernate: select max(Sid) from student
Hibernate: insert into student (Sname, Sdesc, Sid) values (?, ?, ?)
Hibernate: update student set Cid=? where Sid=?
*/
@Test
public void testSaveClassesAndStudents_R(){
Session session=sessionFactory.openSession();
Transaction transaction=session.beginTransaction();
Classes classes=(Classes) session.get(Classes.class, 1L);
Student student=new Student();
student.setSname("Lucy");
student.setSdesc("qwertyuiop");
Set<Student> set=new HashSet<Student>();
//建立关系
classes.getStudents().add(student); //classes.setStudents(set); 把班级中的学生重新更新了 transaction.commit();
session.close();
}
//6、已经存在一个学生,新建一个班级,并且建立该学生和该班级之间的关系
/*
* Hibernate: select student0_.Sid as Sid0_0_, student0_.Sname as Sname0_0_, student0_.Sdesc as Sdesc0_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 Cid=? where Sid=?
*/
@Test
public void testSaveStudentAndClasses_R(){
Session session =sessionFactory.openSession();
Transaction transaction= session.beginTransaction(); Student student=(Student) session.get(Student.class, 2L); Classes classes=new Classes();
classes.setCname("文艺青年班");
classes.setCdesc("感觉都是文艺青年棒棒哒"); Set<Student> set=new HashSet<Student>();
set.add(student);
classes.setStudents(set); session.save(classes); transaction.commit();
session.close();
} //7、已经存在一个学生,已经存在一个班级,解除该学生和原来班级之间的关系,建立该学生和新班级之间的关系
/*
* Hibernate: select student0_.Sid as Sid0_0_, student0_.Sname as Sname0_0_, student0_.Sdesc as Sdesc0_0_ from student student0_ where student0_.Sid=?
Hibernate: select classes0_.Cid as Cid1_0_, classes0_.Cname as Cname1_0_, classes0_.Cdesc as Cdesc1_0_ from classes classes0_ where classes0_.Cid=?
Hibernate: select students0_.Cid as Cid1_1_, students0_.Sid as Sid1_, students0_.Sid as Sid0_0_, students0_.Sname as Sname0_0_, students0_.Sdesc as Sdesc0_0_ from student students0_ where students0_.Cid=?
Hibernate: update student set Cid=? where Sid=?//建立关系
*
*/
@Test
public void testSaveRemove_Student_Classes(){
Session session=sessionFactory.openSession();
Transaction transaction=session.beginTransaction();
Student student=(Student) session.get(Student.class, 2L); Classes classes=(Classes) session.get(Classes.class, 1L);
classes.getStudents().add(student);//建立关系,没有必要删除与原来班级的关系,建立关系之后,自动解除与原来班级的关系
transaction.commit();
session.close();
}
//8、已经存在一个学生,解除该学生和该学生所在班级之间的关系
/*
* Hibernate: select student0_.Sid as Sid0_0_, student0_.Sname as Sname0_0_, student0_.Sdesc as Sdesc0_0_ from student student0_ where student0_.Sid=?
Hibernate: select classes0_.Cid as Cid1_0_, classes0_.Cname as Cname1_0_, classes0_.Cdesc as Cdesc1_0_ from classes classes0_ where classes0_.Cid=?
Hibernate: select students0_.Cid as Cid1_1_, students0_.Sid as Sid1_, students0_.Sid as Sid0_0_, students0_.Sname as Sname0_0_, students0_.Sdesc as Sdesc0_0_ from student students0_ where students0_.Cid=?
Hibernate: update student set Cid=null where Cid=? and Sid=?
*
*/
@Test
public void testRemoveStudent(){
Session session=sessionFactory.openSession();
Transaction transaction =session.beginTransaction(); Student student=(Student) session.get(Student.class, 1L);
Classes classes=(Classes)session.get(Classes.class, 1L);
classes.getStudents().remove(student);
transaction.commit();
session.close();
} //9、解除该班级和所有的学生之间的关系,再重新建立该班级和一些新的学员之间的关系
/*
* Hibernate: select classes0_.Cid as Cid1_0_, classes0_.Cname as Cname1_0_, classes0_.Cdesc as Cdesc1_0_ from classes classes0_ where classes0_.Cid=?
Hibernate: select student0_.Sid as Sid0_, student0_.Sname as Sname0_, student0_.Sdesc as Sdesc0_ from student student0_ where student0_.Sid in (3 , 4 , 5)
Hibernate: update student set Cid=null where Cid=?
Hibernate: update student set Cid=? where Sid=?
Hibernate: update student set Cid=? where Sid=?
Hibernate: update student set Cid=? where Sid=?
*
*/
@Test
public void testRemoveAllAndAddSome(){
Session session =sessionFactory.openSession();
Transaction transaction= session.beginTransaction(); Classes classes=(Classes) session.get(Classes.class, 1L);
List<Student> students= session.createQuery("FROM Student WHERE Sid IN(3,4,5) ").list(); Set<Student> sets=new HashSet<Student>(students);
classes.setStudents(sets); transaction.commit();
session.close();
} //10、解除该班级和所有的学生之间的关系
/*
* Hibernate: select classes0_.Cid as Cid1_0_, classes0_.Cname as Cname1_0_, classes0_.Cdesc as Cdesc1_0_ from classes classes0_ where classes0_.Cid=?
Hibernate: update student set Cid=null where Cid=?
*/
@Test
public void testRemoveAll(){
Session session=sessionFactory.openSession();
Transaction transaction =session.beginTransaction(); Classes classes=(Classes) session.get(Classes.class, 1L);
classes.setStudents(null); transaction.commit();
session.close();
}
/*
* 11、删除班级
* *
* * 解除该班级和所有的学生之间的关系
* * 删除该班级
* *
* 删除班级的同时删除学生
* 12、删除学生
* 同删除班级
*
*/
//11、删除学生,同删除班级
/*
* Hibernate: select classes0_.Cid as Cid1_0_, classes0_.Cname as Cname1_0_, classes0_.Cdesc as Cdesc1_0_ from classes classes0_ where classes0_.Cid=?
Hibernate: select students0_.Cid as Cid1_1_, students0_.Sid as Sid1_, students0_.Sid as Sid0_0_, students0_.Sname as Sname0_0_, students0_.Sdesc as Sdesc0_0_ from student students0_ where students0_.Cid=?
Hibernate: update student set Cid=null where Cid=?
Hibernate: delete from student where Sid=?
Hibernate: delete from student where Sid=?
Hibernate: delete from student where Sid=?
Hibernate: delete from classes where Cid=?
*/
@Test
public void testDeleteClasses(){
Session session =sessionFactory.openSession();
Transaction transaction=session.beginTransaction(); Classes classes=(Classes) session.get(Classes.class, 1L);
session.delete(classes); transaction.commit();
session.close();
}
}

一对多单向关联例子

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

  1. Java进阶知识09 Hibernate一对多单向关联(Annotation+XML实现)

    1.Annotation 注解版 1.1.在一的一方加Set 1.2.创建Customer类和Order类 package com.shore.model; import java.util.Hash ...

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

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

  3. Hibernate 一对多双向关联Demo

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

  4. Java进阶知识11 Hibernate多对多单向关联(Annotation+XML实现)

    1.Annotation 注解版 1.1.应用场景(Student-Teacher):当学生知道有哪些老师教,但是老师不知道自己教哪些学生时,可用单向关联 1.2.创建Teacher类和Student ...

  5. Java进阶知识08 Hibernate多对一单向关联(Annotation+XML实现)

    1.Annotation 注解版 1.1.在多的一方加外键 1.2.创建Customer类和Order类 package com.shore.model; import javax.persisten ...

  6. Hibernate从入门到精通(八)一对多单向关联映射

    上次的博文Hibernate从入门到精通(七)多对一单向关联映射我们主要讲解了一下多对一单向关联映射,这次我们继续讲解一下一对多单向映射. 一对多单向关联映射 在讲解一对多单向关联之前,按照我们的惯例 ...

  7. Hibernate(八)一对多单向关联映射

    上次的博文Hibernate从入门到精通(七)多对一单向关联映射我们主要讲解了一下多对一单向关联映射, 这次我们继续讲解一下一对多单向映射. 一对多单向关联映射 在讲解一对多单向关联之前,按 照我们的 ...

  8. hibernate之关于一对多单向关联映射

    [hibernate]之关于一对多单向关联映射 基于外键的一对多关联映射! 一对多,Group(组)对于Person(人),一个组能够有多个人!ok? Hibernate主要有两种配置方法.一种是An ...

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

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

随机推荐

  1. android 随手记 自定义广播通知栏

    自定义通知栏图标?不是很简单么.自定义布局都不在话下! 是的,有xml布局文件当然一切都很简单,如果不给你布局文件用呢? 听我慢慢道来! 首先怎么创建一个通知呢? 1.new 一个 Notificat ...

  2. 嵌入式 linux 查看内存

    在Windows系统中查看内存的使用情况很简单,想必大家都已经耳熟能详了,那么在linux系统如何查看内存使用情况呢?下面和大家分享在Linux下查看内存使用情况的free命令: [root@scs- ...

  3. 数据结构(线段树):BZOJ 3126: [Usaco2013 Open]Photo

    3126: [Usaco2013 Open]Photo Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 222  Solved: 116 Descrip ...

  4. 一招解决IE7无法访问https网页

    很多人都遇到过这种情况: 自己的IE访问不了https的网页了,如果你百度的话,有人会告诉你注册一堆的dll文件,或者更改IE设置啦什么的.上午,我也遇到这个问题,这些方法都不管用.请教了高手,将方法 ...

  5. 原生JavaScript拖动div兼容多种浏览器

    说句题外话,虽然博客园嵌入式氛围不行,Web前端氛围还是很好的.我又从 chinaunix 回来了. <html> <head> <script type="t ...

  6. C语言变量的理解

    1.定义: 变量是一段有名字的连续存储空间.在源代码中通过定义变量来申请并命名这样的存储空间,并通过变量的名字来使用这段存储空间.下面,我们来理解怎样定义一个变量.例如去住酒店.第一步,前台登记:住几 ...

  7. Fragmen横竖屏切换,导致页面混乱,oncreateView重复调用

    在清单文件Activity设置属性 android:screenOrientation="landscape" android:configChanges="screen ...

  8. JavaScript中的声明提升

    JavaScript中变量或者函数的声明会被提升(赋值语句不会被提升)到当前函数主体的顶部,不管这个声明是否出现在不可到达的地方. var test = 1; function f() { if(!t ...

  9. Apache-Tika解析XML文档

    通常在使用爬虫时,爬取到网上的文章都是各式各样的格式处理起来比较麻烦,这里我们使用Apache-Tika来处理XML格式的文章,如下: package com.mengyao.tika.app; im ...

  10. android 客户端 和 新浪微博如何打通的

    微博SDK 为开发者 提供访问oauth2.0 授权认证,并集合sso登录功能,使用第三方应用可通过 新浪微博的 登录操作 提供微博分享功能,可直接通过微博客户端分享微博 名词解释 AppKey 分配 ...