Hibernate_day03--课程安排_表之间关系_一对多操作
Hibernate_day03
上节内容
|
1 实体类编写规则 2 hibernate主键生成策略 3 实体类操作 (1)crud操作 (2)实体类对象状态 4 hibernate的一级缓存 5 hibernate的事务操作 (1)事务代码规则写法 6 hibernate其他的api(查询) |
今天内容
|
1 表与表之间关系回顾 (1)一对多(客户和联系人) (2)多对多(用户和角色) 2 hibernate一对多操作 (1)*一对多映射配置 (2)一对多级联保存(同时操作多个表进行保存) (3)一对多级联删除 (4)inverse属性 3 hibernate多对多操作 (1)*多对多映射配置 (2)多对多级联保存(重点) (3)多对多级联删除 (4)维护第三张表 |
表与表之间关系回顾(重点)
|
1 一对多 (1)分类和商品关系,一个分类里面有多个商品,一个商品只能属于一个分类 (2)客户和联系人是一对多关系 - 客户:与公司有业务往来,百度、新浪、360 - 联系人:公司里面的员工,百度里面有很多员工,联系员工 ** 公司和公司员工的关系 - 客户是一,联系人是多 - 一个客户里面有多个联系人,一个联系人只能属于一个客户 (3)一对多建表:通过外键建立关系
2 多对多 (1)订单和商品关系,一个订单里面有多个商品,一个商品属于多个订单 (2)用户和角色多对多关系 - 用户: 小王、小马、小宋 - 角色:总经理、秘书、司机、保安 ** 比如小王 可以 是总经理,可以是司机 ** 比如小宋 可以是司机,可以是秘书,可以保安 ** 比如小马 可以是 秘书,可以是总经理 - 一个用户里面可以有多个角色,一个角色里面可以有多个用户 (3)多对多建表:创建第三张表维护关系
3 一对一 (1)在中国,一个男人只能有一个妻子,一个女人只能有一个丈夫 |
Hibernate的一对多操作(重点)
一对多映射配置(重点)
|
以客户和联系人为例:客户是一,联系人是多 第一步 创建两个实体类,客户和联系人 第二步 让两个实体类之间互相表示 (1)在客户实体类里面表示多个联系人 - 一个客户里面有多个联系人 //在客户实体类里面表示多个联系人,一个客户有多个联系人 具体: public class Customer {
(2)在联系人实体类里面表示所属客户 - 一个联系人只能属于一个客户 //在联系人实体类里面表示所属客户,一个联系人只能属于一个客户 具体: public class LinkMan {
第三步 配置映射关系 (1)一般一个实体类对应一个映射文件 (2)把映射最基本配置完成 Customer.hbm.xml <!-- 1 配置类和表对应 LinkMan.hbm.xml <!-- 1 配置类和表对应 (3)在映射文件中,配置一对多关系 - 在客户映射文件中,表示所有联系人 Customer.hbm.xml <!-- 在客户映射文件中,表示所有联系人 - 在联系人映射文件中,表示所属客户 LinkMan.hbm.xml <!-- 表示联系人所属客户 第四步 创建核心配置文件,把映射文件引入到核心配置文件中
测试: 运行HibernateUtils.java工具类 public class HibernateUtils {
|
一对多级联操作
|
级联操作 1 级联保存 (1)添加一个客户,为这个客户添加多个联系人 2 级联删除 (1)删除某一个客户,这个客户里面的所有的联系人也删除 |
一对多级联保存
|
1 添加客户,为这个客户添加一个联系人 (1)复杂写法: public class HibernateOnetoMany {
(2)简化写法 - 一般根据客户添加联系人 第一步 在客户映射文件中进行配置 - 在客户映射文件里面set标签进行配置
第二步 创建客户和联系人对象,只需要把联系人放到客户里面就可以了,最终只需要保存客户就可以了 //演示一对多级联保存 简单写法 |
一对多级联删除
|
1 删除某个客户,把客户里面所有的联系人删除 2 具体实现 第一步 在客户映射文件set标签,进行配置 (1)使用属性cascade属性值 delete
第二步 在代码中直接删除客户 (1)根据id查询对象,调用session里面delete方法删除
3 执行过程: (1)根据id查询客户
(2)根据外键id值查询联系人
(3)把联系人外键设置为null
(4)删除联系人和客户
|
一对多修改操作(inverse属性)
|
1 让小容联系人所属客户不是小李,而是小王 //1 根据id查询小容联系人,根据id查询小王的客户 2 inverse属性 (1)因为hibernate双向维护外键,在客户和联系人里面都需要维护外键,修改客户时候修改一次外键,修改联系人时候也修改一次外键,造成效率问题
(2)解决方式:让其中的一方不维护外键 - 一对多里面,让其中一方放弃外键维护 - 一个国家有总统,国家有很多人,总统不能认识国家所有人,国家所有人可以认识总统 (3)具体实现: 在放弃关系维护映射文件中,进行配置,在set标签上使用inverse属性
|
Hibernate_day03--课程安排_表之间关系_一对多操作的更多相关文章
- 【转】Oracle - 数据库的实例、表空间、用户、表之间关系
[转]Oracle - 数据库的实例.表空间.用户.表之间关系 完整的Oracle数据库通常由两部分组成:Oracle数据库和数据库实例. 1) 数据库是一系列物理文件的集合(数据文件,控制文件,联机 ...
- Django数据库的查看、删除,创建多张表并建立表之间关系
配置以下两处,可以方便我们直接右键运行tests.py一个文件,实现对数据库操作语句的调试: settings里面的设置: #可以将Django对数据库的操作语法,能输出对应的的sql语句 LOGGI ...
- 阶段3 1.Mybatis_09.Mybatis的多表操作_1 mybatis表之间关系分析
4.mybatis中的多表查询 表之间的关系有几种: 一对多 多对一 一对一 多对多 举例: 用户和订单 ...
- Hibernate中表与表之间的关联一对多,级联保存和级联删除
1:Hibernate的一对多操作(重点) 一对多映射配置 第一步:创建两个实体类:客户和联系人(例)以客户为一,联系人为多: package com.yinfu.entity; public cla ...
- 数据库设计,表与表的关系,一对多。One-To-Many(2)
一对多:主键数据表中只能包含一个记录,而在其关系记录表中这条记录可以与一个或多个记录相关,也可以没有记录与之相关. 关联映射:一对多/多对一存在最普遍的映射关系,简单来讲就如球员与球队的关系:一对多: ...
- mysql 建立表之间关系 练习 1
练习:账号信息表,用户组,主机表,主机组 #用户表 mysql> create table user( id int not null unique auto_increment, userna ...
- mysql 建立表之间关系 练习 2
创建数据库db6 create database db6 charset=utf8; user db6; # 创建班级表 mysql) not null unique); Query OK, rows ...
- Oracle - 数据库的实例、表空间、用户、表之间关系
完整的Oracle数据库通常由两部分组成:Oracle数据库和数据库实例. 1) 数据库是一系列物理文件的集合(数据文件,控制文件,联机日志,参数文件等): 2) Oracle数据库实例则是一组Ora ...
- mysql 建立表之间关系 一对一 练习1
创建db5数据库 create database db5 charset=utf8; use db5; 例一:一个用户只有一个博客 用户表: id name 1 mike 2 alex 3 jack ...
随机推荐
- 【转载】安装mysql8.0.11以及修改root密码、连接navicat for mysql。
1.1. 下载: 官网下载zip包,我下载的是64位的: 下载地址:https://dev.mysql.com/downloads/mysql/ 下载zip的包: 下载后解压:(解压在哪个盘都可以的) ...
- cocos2d-x-3.0创建项目
之前一直用的是cocos2d-x-2.3版本号,使用tools里面的create-project.py脚本能够非常方便的创建项目.今天更新为3.0后,发现新版创建项目的方式有了非常大的改变,于是在这里 ...
- __packed字节对齐
比如: typedef __packed struct READ_Command{ u_char code; u_int addr; u_char len;} READ_Comman ...
- atoi 和 itoa
转自:http://www.cnblogs.com/cobbliu/archive/2012/08/25/2656176.html atoi 和 itoa是面试笔试经常要考到的题目,下面两份代码是用C ...
- Redis(七):Jedis简介和集群
Jedis简介 1.Jedis 是Redis 客户端工具jar2.使用非集群版示例代码 Jedis jedis = new Jedis("192.168.139.132", 637 ...
- linux命令之fuser
Usage: fuser [ -a | -s | -c ] [ -n SPACE ] [ -SIGNAL ] [ -kimuv ] NAME... [ - ] [ -n SPACE ] [ -SIGN ...
- MySQL编程API
1.MySQL API数据结构 MySQL API中用到了很多结构体类型,下面就简单说一下常用的结构体. MYSQL 连接数据库前,必须先创建MYSQL变量,此变量在很多MySQL API函数中会用到 ...
- Missing separate debuginfos, use: debuginfo-install
环境:CentOS6.2 64位 操作:使用gdb调试C++查询MySQL数据库的程序 原因: 解决办法: 1. 修改文件/etc/yum.repos.d/CentOS-Debuginfo.repo ...
- 插入节点appendChild()
http://www.imooc.com/code/1698 插入节点appendChild() 在指定节点的最后一个子节点列表之后添加一个新的子节点. 语法: appendChild(newnode ...
- ibatis时间比较大小
<![CDATA[ A.RFID_Time >= #StartTime# ]]>时间搜索功能 A.RFID_Time <













