1 hibernate 的对象关系映射

Orm:

类-----表

属性------字段

对象------记录

表:在数据库中存在主外键的关系,反向工厂类是由表生成,在由表生成类的时候,类和类之间存在者某个关系。将数据库的主外键关系,在java类型进行体现和维护(建立数据之间的关系和断开关系)。

2 单向的one-to-many

家庭和成员(家庭和成员之间的关系,是由家庭进行体现,成员不体现)

父亲和子女

班级和学生

……

2.1 单向one-to-many数据库的模型

在数据库中两张表,产生主外键关系。

描述班级和学生的关系

2.2单向one-to-many  java中的模型体现

通过java中的pojo进行表之间关系的体现。

在班级中定义班级下的学生的集合。

2.3单向one-to-many的配置

Classes.hbm.xml

 <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="org.guangsoft.pojo">
<!-- 类 到 表 -->
<class name="Classes" table="t_classes">
<id name="cid" column="cid" type="java.lang.Integer">
<generator class="native"></generator>
</id>
<!-- 其他简单属性 -->
<property name="cname" column="cname" type="java.lang.String"></property>
<!-- 进行单向one-to-many的映射配置 -->
<set name="stus" table="t_student">
<key column="cid"></key>
<!-- one:表示的Classes班级 many:表示的Student学生 calss属性:表示set集合中元素的类型。 x-to-y:当前标签在谁的配置文件中,x就代表谁。y就表示对方。
<element column="cls" type="java.lang.String"></element> -->
<one-to-many class="Student" />
</set>
</class>
</hibernate-mapping>

Student.hbm.xml

 <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="org.guangsoft.pojo">
<!-- 类 到 表 -->
<class name="Student" table="t_student">
<id name="sno" column="sno" type="java.lang.Integer">
<generator class="native"></generator>
</id>
<!-- 其他简单属性 -->
<property name="sname" column="sname" type="java.lang.String"></property>
</class>
</hibernate-mapping>

2.4进行CRUD操作

2.4.1添加班级信息

班级为one的一方,在数据库中为主表。

 /***
* 添加班级信息
* ***/
@Test
public void testSaveClasses(){
//1获得会话session
Session session=sf.openSession();
//2开启事务
Transaction tr=session.beginTransaction();
//3进行增加操作
Classes cls = new Classes();
//cls对象封装数据
cls.setCname("java逆袭班");
session.save(cls);
//提交事务
tr.commit();
//释放资源
session.close();
}

2.4.2添加新班级和学生

在保存班级信息的时候,由于给班级对象,分配了学生信息,这时候会自动建立该班级和集合中学生的关系

 /***
* 添加班级的同时添加学生信息
* set标签的cascade属性:对象的级联操作,对某个对象进行crud操作的是,
* 同时操作该对象,关联的对象
* all:包含所有
* save-update:级联保存和更新,在one-to-many中,实际中通常设置为通过many去保存one
* delete:级联删除
* none:不级联(默认)
* ****/
@Test
public void testSaveClasses2(){
//1获得会话session
Session session=sf.openSession();
//2开启事务
Transaction tr=session.beginTransaction();
//3进行增加操作
Classes cls = new Classes();
//cls对象封装数据
cls.setCname("java爆发班");
/**
* 给班级分配学生信息
* ***/
Student s1 = new Student();
s1.setSname("朱元璋");
Student s2 = new Student();
s2.setSname("刘邦");
//将s1,s2分配给cls(建立班级和学生的关系)
cls.getStus().add(s1);
cls.getStus().add(s2);
session.save(cls);
//提交事务
tr.commit();
//释放资源
session.close();
}

2.4.3 修改班级信息

 /***更新班级信息
*级联更新:更新了班级下的学生的信息
* ***/
@Test
public void testUpdate(){
//1获得会话session
Session session=sf.openSession();
//2开启事务
Transaction tr=session.beginTransaction();
//3进行增加操作
Classes cls = (Classes) session.get(Classes.class, 3);
cls.setCname("javaee班");
//获得该班级学生
Iterator<Student> its=cls.getStus().iterator();
while(its.hasNext()){
//获得某个学生信息
Student s=its.next();
s.setSname(s.getSname()+"名字");
}
session.update(cls);
//提交事务
tr.commit();
//释放资源
session.close();
}

2.4.4查询班级信息

同时关联加载  该班级下的所有学生。

 /**
查询班级信息,
hibernate:在对象关联加载的时候,默认为延迟加载。
延迟加载:在加载A对象的时候,不会立即查询与A对象的其他对象
只有在访问A对象关联的其他对象的时候,(..)在进行数据库的查询
默认延迟加载:提供数据库的加载速度
* ***/
@Test
public void testSelectClasses(){
//1获得会话session
Session session=sf.openSession();
//查询所有的班级
List<Classes> clist=session.createCriteria(Classes.class).list();
//遍历集合
for(Classes c :clist){
System.out.println(c.getCname());
//访问班级下的学生信息
Set<Student> stus = c.getStus();
//获得stus集合的迭代器
Iterator<Student> it = stus.iterator();
while(it.hasNext()){
//获得一个学生信息
Student s=it.next();
System.out.println("\t\t"+s.getSname()+"\t\t"+c.getCname());
}
}
//释放资源
session.close();
}

2.4.5删除班级信息

需要删除主表中的数据,子表中关联的记录怎么处理:

断开主外键,删除主表中的数据,子表中的数据继续存在

主表,子表中的数据一起删除

 /***
删除班级信息
1 删除主表中数据的默认情况,断开主外键关系,删除主表中数据
2cascade级联删除
cascade="all" "delete"
主表,子表一起删除
delete-orphan:当通过控制方解除被控制的对象的时候。会自动将解除关系的对象进行删除
对HashSet集合的使用:注意重写两个方法hashCode 和 equals()
* ***/
@Test
public void testDeleteClasses2(){
//1获得会话session
Session session=sf.openSession();
//2开启事务
Transaction tr=session.beginTransaction();
//3进行增加操作
Classes cls = (Classes) session.get(Classes.class, 6);
//获得该班级的所有学生
Set<Student> stus=cls.getStus();
Student s = new Student();
s.setSno(6);
//删除集合中的某个学生(解除班级和学生的关系)
stus.remove(s);
//提交事务
tr.commit();
//释放资源
session.close();
}
/***给已有的班级,添加学生****/

2.4.5 出现问题

外键不允许为空造成:

使用hashSet集合注意:

hashCode方法

equals()方法

总结:cascade级联操作

All(save-update,delete) :级联保存,更新,删除

save-update:设置为one-to-many,将many的一方设置为save-update

delete:设置one-to-many,将one的一方设置为delete或者all

none:默认的删除是将主外键关系断开,(员工---工资)

Hibernate单向一对多对象关系模型映射的更多相关文章

  1. Hibernate双向一对多对象关系模型映射

    双向one-to-many 描述部门和岗位:一个部门有多个岗位 将单向的one-to-many 和many-to-one合并. 4.1双向的one-to-many数据库模型 create table ...

  2. Hibernate双向多对多对象关系模型映射

    1 双向many-to-many 业务模型: 描述员工和项目 一个员工同时可以参与多个项目 一个项目中可以包含多个员工 分析:数据库的数据模型,通过中间关系表,建立两个one-to-many构成man ...

  3. Hibernate双向一对一对象关系模型映射

    一个员工一辆车:one-to-one 实现一:让汽车表中的外键唯一 create table emp ( eid int primary key auto_increment, ename varch ...

  4. Hibernate 单项一对多的关联映射

    在上一篇中我们简单介绍了多对一的关联映射,本文介绍hibernate中一对多的关联映射. 1.设计表结构 虽然关联关系由多对一变为一对多,但是我们表结构不会发生改变,只是指向变了. 2.创建stude ...

  5. hibernate中一对多关系中的inverse,cascade属性

    举例说明: 一对多关系的两张表:boy.girl(一个男孩可以多个女朋友) boy表结构 Field   Type        ------  -----------  name    varcha ...

  6. Hibernate单向“一对多”关联

    1. 基于连接表的单向“一对多”关联,应该优先被采用其中指定many-to-many的unique="true",为单向“一对多”,不指定就是单向“多对多” <class n ...

  7. Hibernate单向多对一对象关系模型映射

    单向的many-to-one 案例: 班级和学生 父亲和子女 单向:只能由其中一方维护关系 Many-to-one中有many的一方法维护或者体现两者之间的关系. 单向的many-to-one描述学生 ...

  8. 6.Hibernate单向的多对一 关联映射

    1.创建如下项目结构 2.在项目的src下创建hibernate.cfg.xml主配置文件 <?xml version="1.0" encoding="UTF-8& ...

  9. Dapper实现一对多对象关系聚合导航属性

    领域对象:Game(游戏), Room(游戏群),两者一对多的关系,SQL语句中会用到JOIN public class Game : AggregateRoot { public string Ta ...

随机推荐

  1. POJ 3034 Whac-a-Mole

    Whac-a-Mole Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 3070 Accepted: 922 Descriptio ...

  2. 全键盘Vimium快捷键学习记录

    0.设置而 vimium 的默认搜索引擎: http://www.baidu.com/s?wd= j: 向下细微滚动窗口.  k:向上细微滚动窗口. gg:跳转到页面的顶部.G:跳转到页面的底部.r: ...

  3. 大数据之Ganglia安装1

    0.前期准备修改主机名.ip.iptables关闭:时间同步:ntpdate -s time.windows.com;软件准备ganglia-3.7.1.tar.gz.ganglia-web-3.7. ...

  4. Lab1--关于安装JUnit的简要描述

    安装JUnit的过程描述: 下载两个jar包: hamcrest-all-1.3.jar junit-4.12.jar 注意在导入完成jar包之后不要随意改变jar包的路径. 创建java程序,书写如 ...

  5. LR学习笔记---参数设置 (转 温故而知新)

    LR在录制程序运行的过程中,VuGen(脚本生成器) 自动生成了包含录制过程中实际用到的数值的脚本,如果你企图在录制的脚本中使用不同的数值执行脚本的活动(如查询.提交等等),那么你必须用参数值取代录制 ...

  6. JQuery测手速小游戏-遁地龙卷风

    (-1)写在前面 我用的chrome49,jquery3.0,我得到过399分,信不信由你. (1)设计思路 两个p元素放在div里,每个p元素的高度和宽度都和div一样,当鼠标放在div上时,第一个 ...

  7. BZOJ1251——序列终结者

    给你一个数列,让你实现区间加上一个值,区间翻转,区间最大值 裸splay,懒标记一发即可 #include <cstdio> #include <cstdlib> #inclu ...

  8. 在c或c+程序里打印调用栈。转

    在C/C++程序里打印调用栈信息 我们知道,GDB的backtrace命令可以查看堆栈信息.但很多时候,GDB根本用不上.比如说,在线上环境中可能没有GDB,即使有,也不太可能让我们直接在上面调试.如 ...

  9. HDU 2819 隐式二分图匹配

    http://acm.hdu.edu.cn/showproblem.php?pid=2819 这道题乍一看是矩阵变换题,估计用矩阵之类的也可以做 但是分析一下就可以知道 要凑成对角线都是1,题目允许行 ...

  10. COGS 2421.[HZOI 2016]简单的Treap 题解

    题目大意: 给定n个数及其优先级,求对应的符合最小堆性质的Treap的先序遍历. n<=500000. 解法: 目前为止我只想到了三种解法,其中第三种是正解. 1.暴力1 以优先级为关键字排序, ...