hibernate对象关系实现(一)一对多
hibernate是对jdk一个封装工具,实现对象和数据库之间数据映射。使用时涉及到四个问题:a.对象之间的关系在类中的体现;b,对象关系对应的数据库中表之间体现;c.实现a,b在hibernate的配置,d.对象之间获取保存更新删除的差异
一:1-n/n-1(单向的一对多/多对一),1 <-> n (双向一对多即双向多对一).
单向:只能从特定的一方联系到另一方,类中的体现是一个对象有另一个对象(或者是对象数组)的引用做属性;
双向:对象之 间都有对方的引用;
一对多:一个对象关联多个对象
1.单向n-1:以多个订单对应一个客户为例
a.仅是多的一方订单类中引用客户对象:
(客户类) (订单类):引用属性customer
b.数据库中,多的对应的订单表中拥有一的客户表主键做外键关联:
c.需要在多的订单类.hbm.xml中除一般的映射额外添加<manytoone>配置:
客户类映射配置:
订单类,映射配置:
注意:引用属性customer对应的配置是<many-to-one> 中的配置;
class的值:一的一端的类;
colum的值:是客户表主键所对应的在订单表中外键的名称(可随意取);其值也将客户和订单联系起来
hibernate.cfg.xml配置:
d.测试:省略session的获取提交关闭:
or
执行效果:
保存:先客户后订单将执行三条插入语句;
先订单后客户将执行三条插入后再执行两条更新语句;因为订单的外键需要客户主键值,刚开始订单插入没有外键值,后面得外键值再更新。
获取:
默认情况下,获取订单对象时只发送查询订单的sql不会同时查询出关联的客户对象,
只有当使用到订单中的客户对象时才去发送查询客户数据;实际上在获取订单对象时,内部关联的客户对象是一个代理对象,当使用时才去初始化数据(发送查询语句),如 果session关闭可能出现懒加载异常;
更新:
执行的是查询查询再更新;(不需要添加更新操作,因为commit()前会自动检查持久对象是否需要更新)
删除:
默认情况库中主键有外键的引用不能执行删除。
2.双向n-1也是双向一对多:同样是客户和订单关系。多个订单对应一个客户。(突然想到单向一对多怎么弄)
a.双向即双方互相引用,特别之处是一的一方即客户类中有个集合属性引用多个订单对象;而订单类中只是引用客户对象做属性;
注意:一个是接口声明;一个初始化属性
b.数据库方面和上面说过的单向多对一的一样,即客户表的主键做订单的外键。
c.配置方面除了和单向多对一的方式相同外,还有配置一对多的映射配置。
c.1
name:属性名; table:属性对应的表名; column:"表中的外键名"; class:表对应的类
c.2:set元素中添加inverse=true属性;
通过inverse属性配置,让一的一方即客户方放弃对主键所对应的外键数据的维护;
d.测试:
:记得添加customer对oreder的引用对象;
保存:在c.1配置下
先客户后订单将执行三条插入,两条更新语句;因为是双向维护的,可以看成是两个独立配置在维护数据。客户数据插入后,客户方去更新订单外键信息。
先订单后客户将执行三条插入后再执行四条更新语句;因为订单的外键需要客户主键值,刚开始订单插入没有外键值,后面得外键值再更新。另外一的一方也去更新外键。
c.2配置下:set元素中配置inverse=true;
一的一方放弃对应的外键维护,即只由多的一方(订单类)来维护外键值,也是推荐使用的,因为一的一方不知道多的一方是否已经获取外键值总是去更新,而多的一方获 取到外键值后就不会再多余的更新操作了。
保存的先后顺序和单向的一样。
之后的都是在c2配置下:
获取:从订单对客户的获取和单向一样;(其实也就是每份配置决定获取的方式:)下面是客户中获取订单:
因为也是延长加载,也可能出现懒加载异常。只有使用到集合的元素时才会进行初始化,即查询数据。可能在获取元素个数的时候,只是count语句,不初始化数据。
更新:没什么特别的:
删除:不能删除客户对象,因为有外键约束。
补充:set中的属性 inverse ,cascade,order-by
inverse:反转的意思,默认为false;等于true表示外键值由多的一方维护。
cascade:级联操作:(实际开发不建议使用)
为delete时,删除客户就能把对应的订单全部删除;
为delete-orphon时,清空客户中的集合对象时,就删除对应的订单,但客户数据仍然不变;
为save-update时,只保存客户对象,将自动把对应的订单对象也保存;
order-by:按字段进行排序:在查询对象集合集合时,会按字段进行排序查询;
hibernate对象关系实现(一)一对多的更多相关文章
- Hibernate 对象关系映射文件
简介: POJO 类和关系型数据库之间的映射可以用一个 XML 文档来定义 通过 POJO 类的数据库映射文件,Hibernate 可以理解持久化类和数据表之间的对应关系,也可以理解持久化类属性与数据 ...
- hibernate对象关系映射( 一对一,一对多,多对一,多对多的单向,双向映射 ——)
对象之间的关系: 关系映射之间的关系只的是对象之间的关系,并不指数据库表的关系(外键关系)这儿解决的问题是当对象之间的关系之一时,数据库表该如何映射,编程上如何对待. 一对一(主键关联,和单向的外键关 ...
- hibernate对象关系实现(二)一对一
双向一对一以部门和经理为例: a.部门和经理类中各自由对方的引用:(省略了get/set方法) b.数据库两种方式实现:一种(b.1)是外键映射,并将外键添加唯一约束(至于哪个对象的主键做外键,可随意 ...
- hibernate对象关系实现(三)多对多实现
单向n-n:(catogory-item)一个类别对应多个条目,一个条目对应多个类别 a.以类别类中有条目的集合的引用为例: b.数据库中的体现:建立一个新表,以类别和条目的主键关联的外键做新表的联合 ...
- hibernate对象关系映射的配置
一对一主键关联单双向 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-m ...
- hibernate对象关系实现(四)继承实现
继承实现方式分为三种:subclass; joined-subclass;union-subclass a.类中体现 b.库中体现分为三种: b.1:一种方式:人和学生公用一张表,添加一个辨别字段 ...
- Hibernate -- 对象关系映射基础
- Hibernate学习笔记三:对象关系映射(一对一,一对多,多对一,多对多)
如需转载,请说明出处:http://www.cnblogs.com/gudu1/p/6895610.html Hibernate通过关系映射来表示数据库中表与表之间的关系,关系映射可以通过两种方式:配 ...
- Hibernate:对象关系映射(一对一,一对多,多对一,多对多)
如需转载,请说明出处:http://www.cnblogs.com/gudu1/p/6895610.html Hibernate通过关系映射来表示数据库中表与表之间的关系,关系映射可以通过两种方式:配 ...
随机推荐
- Python学习总结:目录
Python 3.x总结 Python学习总结[第一篇]:Python简介及入门 Python学习总结[第二篇]:Python数据结构 Python学习总结[第三篇]:Python之函数(自定义函数. ...
- jquery.rotate.js库中的rotate函数怎么用。
rotate是jQuery旋转rotate插件,支持Internet Explorer 6.0+ .Firefox 2.0 .Safari 3 .Opera 9 .Google Chrome,高级浏览 ...
- 【转】MYSQL入门学习之十三:自定义函数的基本操作
转载地址:http://www.2cto.com/database/201212/177382.html 一.自定义函数(UDF)的特性和功能 www.2cto.com 函数能分 ...
- YTU 2335: 0-1背包问题
2335: 0-1背包问题 时间限制: 1 Sec 内存限制: 128 MB 提交: 15 解决: 12 题目描述 试设计一个用回溯法搜索子集空间树的函数.该函数的参数包括结点可行性判定函数和上界 ...
- TCP三次握手
TCP协议下,客户的和服务器的连接过程称为“三次握手” 第一次握手:建立连接时,客户的发送SYN包到服务器,并进入SYN_SEND状态,等待服务器确认. 第二次握手:服务器收到SYN包,必须确 ...
- OBD芯片应用开发手册 OBD2开发 内部资料分享 汽车电子通讯开发TDA61 TDA66芯片
OBD产品及各种汽车电子相关的开发.往往需要开发者学习各种汽车协议,深入了解全部OBD规范和汽车各性能参数.这往往需要开发者很长的时间学习研究,大大延缓了OBD产品的上市开发进度.为此深圳芯方案电子公 ...
- oracle 导出导入常见问题
oracle 导入导出常见有两种方法 EXP和IMP是客户端工具程序,它们既可以在客户端使用,也可以在服务端使用.EXPDP和IMPDP是服务端的工具程序,他们只能在ORACLE服务端使用,不能在客户 ...
- 网站性能优化之CSS无图片技术:三角形
1.使用CSS无图片技术,可以总结得到以下三个优点: 减少请求资源的大小: 减少http的请求个数: 提高可维护性. 一.CSS无图片技术,微博中有哪些实际应用呢? 通过上面的展示,我们可以看到,无图 ...
- Javascript正则表达式笔记
一.字符类 将单独的直接字符放进[]内,就组成了字符类.一个字符类和它所包含的任何字符都匹配. 例如:/[abc]/ 与abc三个字母的任意一个匹配. 同时,还可以定义否定字符类.利用^字符.例如:/ ...
- linux 切换多个jdk脚本
1,编写脚本 jdkswitch.sh #!/bin/sh # usage: . this_file [argvs] openjdk7_home=/usr/lib/jvm/java--openjdk- ...