Hibernate学习-14:实体之间的关系及其配置,级联操作
1、实体之间有三种关系:
* 一对多:
* 一个用户,生成多个订单,每一个订单只能属于一个用户.
* 建表原则:
* 在多的一方创建一个字段,作为外键,指向一的一方的主键.
* 多对多:
* 一个学生可以选择多门课程,一个课程可以被多个学生选择.
* 建表原则:
* 创建第三张表,中间表至少有两个字段,分别作为外键指向多对多双方主键.
* 一对一:(特殊.最少.)
* 一个公司只能有一个注册地址,一个注册地址,只能被一个公司使用.(否则将两个表建到一个表.)
* 建表原则:
* 唯一外键:
* 一对一的双方,假设一方是多的关系.需要在多的一方创建一个字段,作为外键.指向一的一方的主键.但是在外键添加一个unique.
* 主键对应:
* 一对一的双方,通过主键进行关联
2、Hibernate中一对多的配置:
第一步:
* 创建两个实体:
* 客户实体:
public class Customer {private Integer cid;private String cname;// 一个客户有多个订单.private Set<Order> orders = new HashSet<Order>();public Integer getCid() {return cid;}public void setCid(Integer cid) {this.cid = cid;}public String getCname() {return cname;}public void setCname(String cname) {this.cname = cname;}public Set<Order> getOrders() {return orders;}public void setOrders(Set<Order> orders) {this.orders = orders;}}
订单实体:
public class Order {private Integer oid;private String addr;// 订单属于某一个客户.放置一个客户的对象.private Customer customer;public Integer getOid() {return oid;}public void setOid(Integer oid) {this.oid = oid;}public String getAddr() {return addr;}public void setAddr(String addr) {this.addr = addr;}public Customer getCustomer() {return customer;}public void setCustomer(Customer customer) {this.customer = customer;}}
第二步:建立映射:
Customer.hbm.xml:
<hibernate-mapping><class name="cn.itcast.hibernate3.demo2.Customer" table="customer"><!-- 配置唯一标识 --><id name="cid" column="cid"><generator class="native"/></id><!-- 配置普通属性 --><property name="cname" column="cname" length="20"/><!-- 建立映射 --><!-- 配置一个集合 <set>的name Customer对象中的关联对象的属性名称. --><set name="orders"><!-- <key>标签中column:用来描述一对多多的一方的外键的名称. --><key column="cno"></key><!-- 配置一个<one-to-many>标签中class属性:订单的类的全路径 --><one-to-many class="cn.itcast.hibernate3.demo2.Order"/></set></class>
</hibernate-mapping>
Order.hbm.xml:
<hibernate-mapping><class name="cn.itcast.hibernate3.demo2.Order" table="orders"><!-- 配置唯一标识 --><id name="oid" column="oid"><generator class="native"/></id><!-- 配置普通属性 --><property name="addr" column="addr" length="50"/><!-- 配置映射 --><!-- <many-to-one>标签name :关联对象的属性的名称.column :表中的外键名称.class :关联对象类的全路径--><many-to-one name="customer" column="cno" class="cn.itcast.hibernate3.demo2.Customer"/></class>
</hibernate-mapping>
第三步:将映射放到核心配置文件中.
Hibernate中级联保存的效果:
级联:操作当前对象的时候,关联的对象如何处理.
cascade=”save-update”
级联方向性:
* 保存客户的时候,选择级联订单.
* 保存订单的时候,选择级联客户.
Hibernate中级联删除的效果:
cascade=”delete”
Hibernate中的级联取值:
none :不使用级联
dave-update :保存或更新的时候级联
delete :删除的时候级联
all :除了孤儿删除以外的所有级联.
delete-orphan :孤儿删除(孤子删除).
* 仅限于一对多.只有一对多时候,才有父子存在.认为一的一方是父亲,多的一方是子方.
* 当一个客户与某个订单解除了关系.将外键置为null.订单没有了所属客户,相当于一个孩子没有了父亲.将这种记录就删除了.
all-delete-orphan :包含了孤儿删除的所有的级联.
双向维护产生多余的SQL:
配置inverse=”true”:在那一端配置.那么那一端放弃了外键的维护权.
* 一般情况下,一的一方去放弃.
cascade:操作关联对象.
inverse:控制外键的维护.
3、Hibernate中多对多的配置:
第一步:创建实体类:
学生的实体:
public class Student {private Integer sid;private String sname;// 一个学生选择多门课程:private Set<Course> courses = new HashSet<Course>();public Integer getSid() {return sid;}public void setSid(Integer sid) {this.sid = sid;}public String getSname() {return sname;}public void setSname(String sname) {this.sname = sname;}public Set<Course> getCourses() {return courses;}public void setCourses(Set<Course> courses) {this.courses = courses;}}
课程的实体:
public class Course {private Integer cid;private String cname;// 一个课程被多个学生选择:private Set<Student> students = new HashSet<Student>();public Integer getCid() {return cid;}public void setCid(Integer cid) {this.cid = cid;}public String getCname() {return cname;}public void setCname(String cname) {this.cname = cname;}public Set<Student> getStudents() {return students;}public void setStudents(Set<Student> students) {this.students = students;}}
第二步建立映射:
Student.hbm.xml
<hibernate-mapping><class name="cn.itcast.hibernate3.demo3.Student" table="student"><!-- 配置唯一标识 --><id name="sid" column="sid"><generator class="native"/></id><!-- 配置普通属性 --><property name="sname" column="sname" length="20"/><!-- 配置关联映射 --><!-- <set>标签 name:对应学生中的课程集合的名称 table:中间表名称. --><set name="courses" table="stu_cour"><!-- <key>中column写 当前类在中间表的外键.--><key column="sno"></key><!-- <many-to-many>中class:另一方类的全路径. column:另一方在中间表中外键名称--><many-to-many class="cn.itcast.hibernate3.demo3.Course" column="cno"/></set></class>
</hibernate-mapping>
Course.hbm.xml
<hibernate-mapping><class name="cn.itcast.hibernate3.demo3.Course" table="course"><!-- 配置唯一标识 --><id name="cid" column="cid"><generator class="native"/></id><!-- 配置普通属性 --><property name="cname" column="cname" length="20"/><!-- 配置与学生关联映射 --><!-- <set>中name:对应当前类中的学生的集合的名称 table:中间表的名称--><set name="students" table="stu_cour"><!-- <key>中column:当前类在中间表中外键 --><key column="cno"></key><!-- <many-to-many>中class:另一方的类全路径. column:另一方在中间表中外键名称 --><many-to-many class="cn.itcast.hibernate3.demo3.Student" column="sno"/></set></class>
</hibernate-mapping>
第三步:将映射文件加入到核心配置文件中。
Hibernate学习-14:实体之间的关系及其配置,级联操作相关推荐
- Hibernate学习总结(5)——一对多的级联操作
首先介绍一下一对多是什么,一对多关系是关系数据库中两个表之间的一种关系,该关系中第一个表中的单个行可以与第二个表中的一个或多个行相关,但第二个表中的一个行只可以与第一个表中的一个行相关. 例如:我有一 ...
- 神经张量网络:探索文本实体之间的关系
欢迎大家前往云加社区,获取更多腾讯海量技术实践干货哦~ 译者:Waitingalone 本文翻译自Gaurav Bhatt在 http://deeplearn-ai.com 发表的NEURAL TEN ...
- React学习:组件之间的关系、参数传递-学习笔记
文章目录 React学习:组件之间的关系.参数传递-学习笔记 父到子传递参数 子-父 父-孙 兄弟组件传参 React学习:组件之间的关系.参数传递-学习笔记 父到子传递参数 <!DOCTYPE ...
- 类图之实体之间的关系
类图中实体之间的关系包括:实现.继承(泛化).依赖.关联.聚合.组合,关联强于依赖,组合强于聚合. 下面的类图展示了元素关系在图中用什么样的图形表示.除了最上面抽象接口,其他实体的名字就代表了与上一个 ...
- 六、hibernate表与表之间的关系(多对多关系)
多对多关系 创建实体类和对应映射文件 Student.java 1 package com.qf.entity; 2 3 import java.util.HashSet; 4 import java ...
- 机器不学习:浅析深度学习在实体识别和关系抽取中的应用
机器不学习 jqbxx.com -机器学习好网站 命名实体识别(Named Entity Recognition,NER)就是从一段自然语言文本中找出相关实体,并标注出其位置以及类型,如下图.命名实体 ...
- SpringData Jpa、Hibernate、Jpa 三者之间的关系
JPA规范与ORM框架之间的关系是怎样的呢? JPA规范本质上就是一种ORM规范,注意不是ORM框架--因为JPA并未提供ORM实现,它只是制订了一些规范,提供了一些编程的API接口,但具体实现则由服 ...
- mysql数据库实体_关系型数据库中实体之间的关系
关系型数据库实体间有三种关联关系:一对一,一对多,多对多. 一对一关系(1:1): 如果实体集(表)A 中的每一个实休(就是每行记录),在实体集B中只有一条数据与它对应, 反之实体集B 中的每一个实体 ...
- 人工智能、机器学习、深度学习及三者之间的关系
导读:什么是机器学习,什么是人工智能,什么是深度学习,这些名词概念我们一直有听说,但是也很容易混淆 这是小编的其他文章,希望对大家有所帮助,点击即可阅读 人工智能常用的十大算法 人工智能数学基础 ...
最新文章
- 进程间数据传递:Queue,Pipe 进程间数据共享:Manager
- 浅谈2D游戏设计模式--游戏剧情设计(1)
- AngularJS中ng-repeat对象的问题
- python手机版idle-如何在Ubuntu上安装Python IDE IDLE
- B1277 [HNOI2002]Tinux系统 树形dp
- Graphviz安装配置及入门(windows安装亲测)
- 【演讲实录】RWP团队谈SQL优化
- HDU - 2018 母牛的故事
- winform使用fastreport制作报表(一)安装
- js实现轮播图点击按钮切换下一张图片
- Keras 中文文档地址
- 【Zigbee】进阶篇(1) Zigbee协议栈创建简单项目,协议栈、事件、消息学习
- excel常用快捷键汇总
- 用IE浏览器打开网址https显示不能访问怎么办
- python3 绘制盖尔圆
- mysql 删除一条数据sql语句_sql删除语句
- On Smoothness of a Vector Field-Application to Optical Flow
- 用C语言设计一个简易的选择题答题系统
- 表格提示html内容消失,如何解决Word里面的表格插入题注后页面上内容消失、无法编辑的问题...
- 单招考计算机一般考什么科目,单招一般都考什么科目 单招的考试范围是什么...
热门文章
- 智能优化算法之灰狼优化算法(GWO)的实现(Python附源码)
- git添加/删除远程仓库
- angular.js:13920 Error: [$injector:unpr] Unknown provider: $scopeProvider - $scope - testServe
- html怎么改变li前面的点,CSS定义li前面的小点样式
- OPPO手机里面的快应用是什么
- 计算机外存是ram硬盘还是,都是存储器,但RAM、ROM、闪存、硬盘怎么分?
- 如何利用工具低成本构建阿里云灾备方案?
- Jenkins自动化部署(java+maven+tomcat项目)
- go mod init错误(go: cannot determine module path for source directory)
- GPRS模块的TCP发送数据流程