博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hibernate 加载策略得总结
阅读量:4538 次
发布时间:2019-06-08

本文共 2528 字,大约阅读时间需要 8 分钟。

                                    Hibernate 加载策略得总结

加载策略(优化查询):

策略种类:
延迟加载: 等到使用的时候才会加载数据.
立即加载: 不管使用不使用,都会立刻将数据加载.
策略的应用:
类级别的加载策略.

关联级别的加载策略

----------------------------------------------------------------------
类级别加载策略:
1. get/load
get: 立即查询数据库,将数据初始化
load:  hbm文件中,class元素的lazy属性绝对类级别load方法的加载策略
true:先返回一个代理对象.使用代理对象的属性时,才去查询数据库.
false: 与get一致,会立即加载数据

----------------------------------------------------------------------

关联级别加载策略
在查询有关联关系的数据时,加载一方的数据是否需要将另一方立即查询出.
默认: 与我关联的数据,在使用时才会加载.
集合(一对多):
set 
lazy: 是否对set数据使用懒加载
true:(默认值) 对集合使用才加载
false: 集合将会被立即加载
extra: 极其懒惰,如果使用集合时,之调用size方法查询数量, Hibernate会发送count语句,只查询数量.不加载集合内数据.
fetch : 决定加载集合使用的sql语句种类
select: (默认值) 普通select查询
join: 表链接语句查询集合数据
subselect: 使用子查询 一次加载多个Customer的订单数据
fetch
lazy
结论
------------------------------
----------------------------------
----------------------------------
select 
true
默认值, 会在使用集合时加载,普通select语句
select
false
立刻使用select语句加载集合数据
select
extra
会在使用集合时加载,普通select语句,如果只是获得集合的长度,会发送Count语句查询长度.
join
true
查询集合时使用表链接查询,会立刻加载集合数据
join
false
查询集合时使用表链接查询,会立刻加载集合数据
join
extra
查询集合时使用表链接查询,会立刻加载集合数据
subselect
true
会在使用集合时加载,子查询语句
subselect
false
会在查询用户时,立即使用子查询加载客户的订单数据
subselect   extra
会在使用集合时加载,子查询语句,如果只是获得集合的长度,会发送Count语句查询长度.
            ----------------------------------------------------------------------------------------------------------
多对一:
lazy
 
false
加载订单时,会立即加载客户
 
proxy
看客户对象的类加载策略来决定
 
no-proxy : 不做研究. 
 
fetch=
select  : (默认值)使用普通select加载
join
: 使用表链接加载数据
fetch
lazy
结果
---------------------------------------------------
select
false
加载订单时,立即加载客户数据.普通select语句加载客户.
select
proxy
类加载策略为:lazy=false 同上
lazy=true
加载订单时,先不加载客户数据.使用客户数据时才加载
join
false
使用表链接查询订单以及对应客户信息.lazy属性无效
join
proxy
使用表链接查询订单以及对应客户信息.lazy属性无效

-------------------------------------------------------------------------------------------------------------------

批量加载:
set
batch-size: 决定一次加载几个对象的集合数据. in 条件加载多个用户的订单.

检索总结:(参考)

检索策略

优点

缺点

优先考虑使用的场合

立即检索

对应用程序完全透明,不管对象处于持久化状态还是游离状态,应用程序都可以从一个对象导航到关联的对象

(1)select语句多

(2)可能会加载应用程序不需要访问的对象,浪费许多内存空间。

(1)类级别

(2)应用程序需要立即访问的对象

(3)使用了二级缓存

延迟检索

由应用程序决定需要加载哪些对象,可以避免执行多余的select语句,以及避免加载应用程序不需要访问的对象。因此能提高检索性能,并节省内存空间。

应用程序如果希望访问游离状态的代理类实例,必须保证她在持久化状态时已经被初始化。

(1)一对多或者多对多关联

(2)应用程序不需要立即访问或者根本不会访问的对象

表连接检索

(1)对应用程序完全透明,不管对象处于持久化状态还是游离状态,都可从一个对象导航到另一个对象。

(2)使用了外连接,select语句少

(1)可能会加载应用程序不需要访问的对象,浪费内存。

(2)复杂的数据库表连接也会影响检索性能。

(1)多对一或一对一关联

(2)需要立即访问的对象

(3)数据库有良好的表连接性能。

延迟检索中注意

    Customer  Get(int id)

    Return Session.load(Customer.class,id);

        1. layz=false

        2. Service层获得在页面要上要用到的属性=> Service层中确保数据已经

保证再session关闭时,取出对象数据。

转载于:https://www.cnblogs.com/meiLinYa/p/9222668.html

你可能感兴趣的文章
用Jekyll搭建的Github Pages个人博客实践2
查看>>
masonry
查看>>
ContentProvider初步-------------------笔记
查看>>
asp.net网站中退出系统后通过后退键重新进入系统的解决方法
查看>>
Software Configure
查看>>
正则表达式(一)
查看>>
C# DEV 右键出现菜单
查看>>
数据字典到SQL语句的转换(使用word与VBA)
查看>>
属性赋值-@PropertySource加载外部配置文件
查看>>
1万台币等于多少人民币(2014年04月22日)
查看>>
无法安装64位office,因为您的PC上有32位
查看>>
java实现发送邮件功能
查看>>
Ubuntu 18.04 启用 rc.local 设置开机启动
查看>>
Single Number
查看>>
PostgreSQL之时间戳自动更新
查看>>
常用文件后缀名与打开方式
查看>>
怎么读取照片内的文字
查看>>
php 发送邮件代码
查看>>
execCommand()命令详解及实例展示
查看>>
NSString NSCFString区别
查看>>