Hibernate学习整理(Hibernate优化及HQL)
来源:互联网 发布:js实现图片转base64 编辑:程序博客网 时间:2024/05/21 12:40
6,Hibernate的优化(缓存、懒加载、抓取策略)(重点)
怎样检测Hibernate的性能:发出的sql语句越少
(1)
①懒加载的类型:类的懒加载、集合懒加载、单端关联的懒加载(多对一),其中可以利用session.load()方法产生代理对象,在session.load()方法执行的时候并不发出sql语句,在得到其一般属性的时候发出sql语句,只针对一般属性有效而对标示属性无效。默认情况是懒加载。
在遍历的时候才发出sql语句——集合的懒加载,需要在配置中lazy=”true”懒加载,lazy=”false”不用懒加载,lazy=”extra”更进一步的懒加载(count,min,max,sum)。
②懒加载主要解决的问题:解决hibernate在什么时候发出sql语句的问题。
(2)
解决的问题:发出什么样的sql语句
join
如果把需求分析翻译成sql语句存在子查询,这个时候用该策略不起作用。
select
subselect
如果需要翻译成sql语句存在子查询,这个时候用该策略效率最高
总结:懒加载和抓取策略结合,研究对象时Set集合:
fetch
join
和student全部查询出来
注意:抓取策略只是提供给Hibernate的一种优化方式,只要是抓取策略能做到的都能用hql语句来做。
(3)
①缓存的生命周期
②数据库的数据是怎样放入缓存的
中,不同的线程是不能访问的,所以保证了数据的安全性。
session.refresh()方法可以将数据库的数据同步到缓存中
③缓存中的数据是怎样放到数据库的
注意:在这里可以引发Hibernate的批量操作,如批量插入
可以每几十个数据刷新一下缓存,以避免内存溢出。
④客户端怎样从缓存中把数据取出来的
⑤客户端怎样把一个数据放入到缓存中
⑥怎样把一个对象从缓存中取出
⑦把缓存中所有的数据清空
补充:页面缓存(ehcache,ohcache)场合:
㈢导入ehcache的jar包
④给某个类开启二级缓存:(让某个类或对象进入到二级缓存中)
方案一:在配置文件中
类全名”/>
方案二:在映射文件中
在类中: usage是缓存策略。
在配置文件中:
true
只能在session.createQuery(“from
(4)
(5)
①session的产生
②session的缓存——一级缓存
7,hql语句
8,细小知识点:
①对象的序列化作用:让对象在网络上传输(以二进制的形式传输),Serializable是标识接口,即实现了此接口的类,将告诉虚拟机应将此类对应的对象变成二进制流,即将二进制的工作交给jvm做。
②Hibernate配置文件中方言的作用:告诉Hibernate使用的是哪种类型的数据库。
③Hibernate配置文件中,update
作用:根据持久化类和映射文件生成表
值:
validate
create-drop:当Hibernate启动时生成表,当Hibernate容器结束时删除表
create:每次启动Hibernate容器生成表
update:在启动Hibernate时会检查持久化类和表是否对应,如果不对应,则去创建,对应的时候则验证。
④由表生成持久化类步骤:
将模式切换到MyEclipse Database Explore找到对应的表person
——>
点击hibernate reverse engineering进行
(前提是需要将当前项目转换成Hibernate项目:点击项目——>进入MyEclipse/Project Capabilities/Add Hibernate Capabilities)
——>
接下来进入反向生成mapping映射文件和pojo类的配置。
⑤主键的生成器总结
i
Hibernate: select max(pid) from person
Hibernate: insert into person (pname, psex, pid) values (?, ?, ?)
主键的类型必须是数字
主键的生成是由Hibernate内部完成的,程序员不需要干预。
这种生成机制效率比较低,但是生成的主键是连续的
ii
identity是按照主键的自增机制,MySQL有主键自增机制。
若出现field ‘pid’ doesn’t have a default value的错误就说明该表不支持自动增长机制。
新的主键的产生是由数据库完成的,并不是由Hibernate或者程序员完成的。
该表必须支持自动增长机制
效率比较高
iii
主键生成机制是assigned时,必须在程序中手动地设置其id值。
iv
UUID是由Hibernate内部生成的
主键的类型必须是字符串
注意:Hibernate内部是根据主键生成器来生成主键的,在客户端设置主键不一定起作用,在assigned的时候起作用。
⑥对象的状态:
临时状态的对象:
持久化对象:只有处于持久化状态的对象session才管理
脱管状态的对象:
临时状态的对象——>持久化对象:
session.save();
session.update();
session.get();//当执行这个方法时,得到一个对象,是不需要再执行update语句的,因为此对象已经是持久化对象的状态了。
session.clear();//将session中的所有对象都清空
session.evict();//把一个对象从session中清空,该对象成为脱管状态
注意:
当一个对象是持久化对象的时候,进行提交时,hibernate内部会让该对象和快照进行对比,如果一样,则不发生update语句,如果不一样,则发出update语句。一个对象是否是持久化对象是针对某一个session而言的。
注意:
当执行transaction.commit()的时候,hibernate内部会检查session
如果一个对象为临时状态的对象,则session不会管
如果一个对象是持久化的对象,如果有id值,并且和数据库对应,那么先把该对象与快照进行对比,如果一致,则什么都不做,如果不一致,则发出update语句。
如果一个对象时持久化状态的对象,没有id值,则会发出save语句。
注意:
一个session对应一个事务。
⑦使用增强for循环时只能删除一次,若连续删除将会找不到位置,原因是增强for循环使用的是游标的方式。解决方案:用普通的for循环,或者新建一个Set集合,把原来set集合要保留的数据存放到新的Set集合中。
使用普通的for循环时,需要将set集合转换成为list集合:
List
⑧当在Set集合配置inverse=”true”不维护关系时,删除班级不会级联更新关系,所以会抛出主外键约束的错误。
总结:
1,Hibernate的组成部分:
持久化类
映射文件
配置文件
2,Hibernate的流程
Configuration
SessionFactory(线程安全,单例,信息共享)
Session
Transaction:事务默认不是自动提交的,必须由session开启,必须和当前的session绑定(两个session不可能公用一个事务)
3,session.getCurrentSession的用法:
4,
(1)
thread
(2)
(3)
①因为是一个线程,所以整个方法中一个session,一个事务
②保证了整个业务操作的安全性。
5,hibernate的查询方式
(1)
①”from Classes”与”select cid,cname from Classes”其中带select和不带select的查询结果是完全不相同的,不带select查出来的list是Classes对象数组,而带select的list结果里存放的是objct数组,并且每一个object对象里存放的又是关于属性的数组。
②如果需要用带select的语句并且要求查询出来的是Classes对象,则需要利用发射的机制,
Session.createQuery(“select new Classes(带属性的构造函数)(全类名) from Classes where cid=:cid”)返回一个Query对象
query.setLong(“cid”,1L);
query.uniqueResult();//返回唯一的结果对象
③无论单表、多表,order by,group by,sum,min,max,avg,having等都适用。
④关于一对多的操作:
内连接:
session.createQuery(“from Classes
外连接:
Session.createQuery(“from Classes
其中转换成哪个对象的结果集是看from后面跟着的是哪个类
只取其中部分字段,采用创建javaBean来实现:
Session.createQuery(“select new cn.itcast.hibernate.ClassView(c.cname,s.sname) from Student s left outer join s.classes c”).list();注意这里不能使用fetch。
⑤在多对多三张表联合查询时很可能会出现重复数据的现象,这时候可以将查询出来的list集合转换成set集合,然后再转变为list回来。
(2)
(3)
HQL总结:
1,如果页面上要显示的数据和数据库中的数据相差甚远,利用带select的构造器进行查询是比较好的方案。
2,如果页面上要显示的数据和数据库中的数据相差不是甚远,采用迫切连接。
3,如果采用迫切连接,from
- Hibernate学习整理(Hibernate优化及HQL)
- HIBERNATE HQL小结及优化
- Hibernate HQL优化学习笔记
- Hibernate学习笔记:HQL
- hibernate之HQL学习
- Hibernate HQL 学习点滴
- hibernate HQL学习笔记
- Hibernate查询优化 HQL提高效率
- Hibernate学习---第十节:Hibernate之hql
- hibernate框架学习---HQL查询
- 【SSH】hibernate之hql学习
- Hibernate学习笔记----HQL(1)
- Hibernate学习笔记----HQL(2)
- Hibernate学习笔记----HQL(3)
- hibernate学习笔记4---hql
- Hibernate学习之HQL查询
- Hibernate的hql常用语句整理汇总
- Hibernate HQL
- 青蛙跳和变态青蛙跳问题
- issue
- hdu5119 Happy Matt Friends--dp(待解决)
- 抽象数据类型(ADT) 双链表实现
- Eclipse在MAC下查看Workspace引入的工程
- Hibernate学习整理(Hibernate优化及HQL)
- 前++与后++ a+++b+c+++d++
- 线程相关
- FreeBSD/Solaris使用摘记
- Ab3d.PowerToys 破解
- jQuery.position()对不同浏览器的支持,并不可靠(二,问题解决)
- Educational Codeforces Round 12 E trie树
- [iOS 上传AppStore] 上传AppStore报的一些错汇总:
- Linux shell ${}简单用法