Hibernate 映射及查询
实体类和实体之间的关系:一对多,多对多
数据库设计:e_r 一个实体对象就是一个表格, 如果是1对多的关系,将多方的主键拿到1方做外键。 多对多:重新建立一张新的表格,将双方的主键拿到这里做外键
1、一对多的关系映射。
班级和学生为例:
1、创建班级实体类和学生实体类
2、在班级实体类中用set集合属性来表示班级中有多个学生。
3、在学生实体类中,用班级属性来表示这个学生属于哪个班级
4、在映射文件里面:班级(一方)通过《set》标签来描述我的set属性,然后再set标签里面通过<key>开表示我的主键在多方做外键的时候 外键的名称。再用<one-to-mang>标签来制定我和谁是这个关系,将来hibernate会自动将我的主键放到这个类对应的表格里面做外键,外键字段名就是key标签制定的哪个。
5、在映射文件里面:学生(多方)通过<mang-to-one>来表示我和class属性表示那个类是这个关系,同时用column 来制定对方如果要将主键放到我这里做外键,那么外键的名字就是column制定的哪个。
一对多的级联保存:将班级和学生的关系在代码里面体现完成后,只保存班级信息,那么学生信息也一并保存进去,不用单独写代码去保存学生对象。 需要配置
有1个班级对象,这个班级对象里面有三个学生,现在我要把这四个对象统统保持到数据库里面。
Session.save()
一对多的级联删除:
找到要删除的实体对象,直接删除,他下面的学生实体对象一并会被删除。
一对多的修改:
将李四(2)这个对象调到理工班级(3)
Session获得李四中个对象,获得理工班级对象。把李四加到理工班级对象的set集合里面,更新数据库。
2、多对多关系的映射
课程和学生的例子
创建两个实体对象,分别在这两个实体对象里面维护他们之间的多对多的关系,
在映射文件中配置好。
级联保存:出现了一个重复的主键错误。多对多关系是有第三表来维护,创建的时候是有映射文件去配置创建的,没有给他制定主键,那么会把两个外键看作是主键(联合主键)。
在hibernate里面关系的一个维护使由两个对象共同完成的,是双向维护的一个关系,保持学生他会将学生和课程的关系保持到我们的第三个表格里面,去保存课程课程的时候,课程也要去讲关系保存到第三张表格。
如何解决:就是让其中一方放弃对第三张表格的一个维护:<set inverse=”true”>
级联删除:我删除某个学生,那么和这个学生有关系的课程也会被删除。(一般不会在开发过程中使用)
多对多关系如何维护第三张表格:让张三不选修ssh
单表查询(基本查询)
HQL的基础语法
语法和sql语法基本相同。
和sql语句的一个区别:操纵对象不同。
HQL语句是被Query这个对象使用的。
1、HQL查询所有: from 实体类的名称:
2、HQL的条件查询:from 实体类名 where 实体类属性名=
3、排序查询: order by 属性 asc
4、分页查询:rownum+字查询 不同数据库实现分页的手段不一样。Query对象里面封装了两个方法去实现分页。
5、查询实体对象的部分属性:select 属性名,属性名 from 类名在HQL语句的select后面不允许跟着* :from 类名:
6、聚合函数的使用 :select count(*) from 类名
QBC查询
借助于Criteria对象进行查询:不需要写任何语句,直接使用它封装的方法来完成查询。
1、查询所有:list();
2、条件查询:使用封装的方法:add(条件) Restrictions进行条件的设置。
3、排序: criteria.addOrder(Order.asc("sid"));
4、分页:criteria.setFirstResult(0); criteria.setMaxResults(3);
5、统计:criteria.setProjection(Projections.rowCount());
限制条件:Criteria、Query只能是在session对象产生之后,再产生。Criteria因为所有的功能都是有方法来执行,因此这个对象所查询的条件只有在产生session之后才能进行添加。
万一我 有一个需求:要求在页面阶段就得把条件拼接好,那么Criteria对象没有办法完成这个需求:另外一个对象:DetachedCriteria对象可以完成:这个对象可以独立产生,不需要借助任何session,因此使用这个对象进行的查询我们称之为:离线查询.
离线查询
借助于:DetachedCriteria:和Criteria的查询方法都一致。唯一不同就是可以离线生成。
HQL多表查询
内联接:符合条件的行出现在结果集,不符合的不出现
// 查询班级里面有哪些学生
From MyClass m inner join m.stuSet
查询的结果是一个一个小数组
如果要求返回的结果是对象形式的,那么使用迫切内联接:
迫切内联接:
From MyClass m inner join fetch m.stuSet
左外链接:不管是否符合条件:主表里面的记录一定会出现在结果集里面。
From MyClass m left join m.stuSet
From MyClass m left join fetch m.stuSet
f
右外链接(没有迫切)
From MyClass m right join m.stuSet
检索策略
1、立刻查询:只要执行到我的查询指令,hibernate立刻发送sql指令到数据库吧相应的内容查询出来:get ()就是一个立刻查询的方法
2、延时查询:load():这个方法不会立刻查询数据,只有到不得不去查的时候才去查询。如要获得这个对象里面的主键的话,load方法直接将第二个参数返回给你。只有不得不去查询的时候才发送sql去查。
延时分为两类:
1级别类型的延时:根据id查询类,并且使用时load方法,不会发送sql指令。
2 关联延时:查询班级,如果要班级里的学生信息,那么这个学生信息的查询时机(立刻执行还是延时执行)
Hibernate 默认给我们做了一个优化策略,我查询班级的时候,不会立刻将学生的信息查询出来,当你真的要获得当前班级的学生的时候,hibernate会自动发送sql,将属于这个班级的学生信息查询出来。
可以通过在〈set>设置加载方式 fetch="select" lazy="true"
极其懒惰的加载方式:如果你要查询这个班级的学生的名字,那么这个加载方式只会发送sql指令将学生姓名查询出来。
Hibernate 映射及查询的更多相关文章
- hibernate映射文件
Hibernate的持久化类和关系数据库之间的映射通常是用一个XML文档来定义的.该文档通过一系列XML元素的配置,来将持久化类与数据库表之间建立起一一映射.这意味着映射文档是按照持久化类的定义来创建 ...
- Hibernate —— 映射关联关系
一.映射多对一关联关系. 1.单向的多对一 (1)以 Customer 和 Order 为例:一个用户可以发出多个订单,而一个订单只能属于一个客户.从 Order 到 Customer 是多对一关联关 ...
- hibernate框架之-查询结果集返回类型
Hibernate支持HQL和SQL的查询,返回结果支持POJO类型或字段/数组的形式. 开发中用Hibernate进行数据库查询,用的是SQL.原来需要查询一个表的几乎所有字段,所以我使用了addE ...
- Hibernate原生SQL查询
最近在做一个较为复杂的查询,hibernate基本的查询不能满足,只好使用其提供的原生sql查询.参考网上的一些资料,做一些总结. 对原生SQL查询执行的控制是通过SQLQuery接口进行的,通过执行 ...
- hibernate映射的 关联关系:有 一对多关联关系,一对一关联关系,多对多关联关系,继承关系
hibernate环境配置:导包.... 单向n-1:单向 n-1 关联只需从 n 的一端可以访问 1 的一端 <many-to-one> 元素来映射组成关系: name: 设定待映射的持 ...
- Hibernate 映射关系
映射组成关系 •建立域模型和关系数据模型有着不同的出发点: –域模型: 由程序代码组成, 通过细化持久化类的的粒度可提高代码的可重用性, 简化编程 –在没有数据冗余的情况下, 应该尽可能减少表的数目, ...
- oracle ORA-01747(系统保留关键字)user.table.column, table.column 或列说明无效 hibernate映射oracle保留关键字
1.查询系统关键 select * from v$reserved_words 确认你使用的是否为关键字: select * from v$reserved_words w where w.KEYWO ...
- 02.Hibernate映射基础
前言:Hibernate的核心功能是根据数据库到实体类的映射,自动从数据库绑定数据到实体类.使我们操作实体类(Java对象)就能对数据库进行增.删.查.改,而不用调用JDBC API使数据操作变得简单 ...
- Hibernate之HQL查询
一.Hibernate 提供了以下几种检索对象的方式: 导航对象图检索方式: 根据已经加载的对象导航到其他对象 OID 检索方式: 按照对象的 OID 来检索对象 HQL 检索方式:使用面向对象的 H ...
随机推荐
- bzoj2141排队
/* 动态求逆序对,可以树套树来写, 将交换操作理解成插入和删除比较好理解, 里层是个区间求和的线段树就好了 或者叫 带修主席树? */ #include<cstdio> #include ...
- iReport-5.6.0 新建文件为什么是灰色的?新建项目没有选择项?
从网上下了绿色版和安装版都出现这个问题. 解决:发现原来是有些插件没有激活,进入手动激活就ok了 -->工具-->插件-->已安装 ,选择未激活的手动激活. 激活成功后如下图(和我同 ...
- 遇到问题或bug时要做的事。
1,做事细心,只有细心才能减少bug量,做总结. 2,开发中遇到bug和错误,第一要想到是程序代码的问题.而首先想到的不是其他问题(比如版本,框架或兼容问题等). 3,程序不能按照自己的意愿执行,时先 ...
- 接口测试工具postman/jmeter基本使用
一.接口的分类: 最常用的两种接口webservice接口和http api接口:1.webservice接口走soap协议通过http传输,请求报文和返回报文都是XML格式,现在测试的时候都通过工具 ...
- windows注册表解析说明
https://www.cnblogs.com/wfq9330/p/9176654.html
- PHP判断是手机端还是PC访问
function isMobile(){ $useragent=isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : ' ...
- kudu导入文件(基于impala)
kudu是cloudera开源的运行在hadoop平台上的列式存储系统,拥有Hadoop生态系统应用的常见技术特性,运行在一般的商用硬件上,支持水平扩展,高可用,集成impala后,支持标准sql语句 ...
- PHP对接微信支付采坑
第一次做PHP商城项目对接微信支付接口,踩了N次坑,这也不对,那也不对,搞了很久,查了一些资料,终于实现了支付功能,小小总结一下,万一下次遇到就不用到处找资料了. 微信扫码支付 前期准备: 1.微信公 ...
- vue.js插值,插入图片,属性
<html><head><title>Insert title here</title><script type="text/javas ...
- MySQL数据库的基础学习
1.什么是数据库 用来存储数据的仓库,简称数据库; 数据库可以在硬盘和内存中存储数据 数据库存储数据的本质: 通过文件来存储数据 2.数据库存储数据与文件存储的区别 (1).一个文件仅仅只能存储在一个 ...