惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Google DeepMind News
Google DeepMind News
Stack Overflow Blog
Stack Overflow Blog
Hugging Face - Blog
Hugging Face - Blog
博客园_首页
T
The Blog of Author Tim Ferriss
博客园 - 叶小钗
N
Netflix TechBlog - Medium
腾讯CDC
C
Check Point Blog
P
Proofpoint News Feed
Engineering at Meta
Engineering at Meta
GbyAI
GbyAI
S
SegmentFault 最新的问题
F
Fortinet All Blogs
美团技术团队
U
Unit 42
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
博客园 - 司徒正美
F
Full Disclosure
Recorded Future
Recorded Future
D
DataBreaches.Net
博客园 - 【当耐特】
Martin Fowler
Martin Fowler
J
Java Code Geeks
I
InfoQ
Y
Y Combinator Blog
A
About on SuperTechFans
AI
AI
爱范儿
爱范儿
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Forbes - Security
Forbes - Security
W
WeLiveSecurity
M
MIT News - Artificial intelligence
雷峰网
雷峰网
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Simon Willison's Weblog
Simon Willison's Weblog
Schneier on Security
Schneier on Security
The GitHub Blog
The GitHub Blog
Security Archives - TechRepublic
Security Archives - TechRepublic
aimingoo的专栏
aimingoo的专栏
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
G
GRAHAM CLULEY
Know Your Adversary
Know Your Adversary
Latest news
Latest news
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
D
Docker
Recent Commits to openclaw:main
Recent Commits to openclaw:main
量子位
V2EX - 技术
V2EX - 技术
Project Zero
Project Zero

博客园 - 无会

[转]java取得Linuxcpu,内存,磁盘实时信息 中国32个省的日语读法 26字母日语读法 65个源代码网站 经典面试问题【转】 An introduction to the Java 2 Platform, Enterprise Edition specification by way of BEA's WebLogic Server java 中文网址大全 Struts+Spring+Hibernate整合 自我介绍 [原] 子类访问基类方法 http1.1 MYSQL初学者使用指南 候捷谈Java反射机制 jstl1.0 和 jstl1.1 区别 moiment lrc 日本日記(十二月三日) 自定义Hibernate Dialect解决createSQLQuery时的decimal,long类型问题 hibernate 中 session 说明 java.lang.ClassCastException: org.apache.struts.action.ActionMessage 错误
Hibernate检索策略
无会 · 2007-12-03 · via 博客园 - 无会

Hibernate检索策略:  
立即检索、延迟检索、迫切左外连接检索  
Hibernate检索策略应用对象级别  
类级别、关联级别  
以下表格为类级别和关联级别可选的检索策略及默认的检索策略  

检索策略的作用域  
可选的检索策略  
默认的检索策略  
运行时行为受影响的Session的检索方法  
类级别  
立即加载  
延迟加载  
立即检索  
Load()方法  
关联级别  
立即加载  
延迟加载  
迫切左外连接检索  
多对一或者一对一为迫切左外连接检索  
一对多或者多对多为立即检索  
Get()Load()Find()方法  

以下表格为用于在对象-关系映射文件中设定检索策略的属性  

属性  
可选值  
默认值  
描述  
lazy  
truefalse  
false  
如果为true表示使用延迟加载,如果为false表示使用立即加载  
outer-join  
autotruefalse  
<many-to-one>元素和  
<one-to-one>元素中为auto,在<one-to-many>元素和<many-to-many>元素中为false  

如果为true表示使用迫切左外连接检索。在<many-to-one><one-to-one>、和<set>元素中包含此属性  
如果为false表示使用立即加载  
batch-size  
正整数  
1  
设定批量检索的数量。如果设定此项合理的取值在310之间  

一、类级别的检索策略:  
SessionLoad()Get()Find()方法受到检索策略的影响  
Load()方法的立即检索:立即查询数据库并初始化类实例,查询不到是抛异常  
Load()方法的延迟检索:不检索数据库只返回类的代理实例,举例说明一个Custom  
Custom类通过Session.Load()方法延迟加载持久化对象时,只是将Custom对象的对象标识赋值,并没有操作数据库;当我们访问这个对象的标识属性时也只是简单返回对象标识,并不操作数据库。而当我们访问Custom对象的其它属性时由于没有初始化,所以要检索数据库并赋值给该属性。这个时候要保证此对象的Session连接时正常的。  
Get()方法的检索策略:只有立即加载策略。查询不到返回null  
Find()方法的检索策略:只有立即加载策略。  
如果我们在使用SessionLoad()Get()Find()方法时并不知道检索策略,我们可以在调用这些方法后立即执行以下代码来初始化持久化对象:  
If( !Hibernate.isInitialized(customer))  
{  
         Hibernate.initialize(customer);  
}  
二、关联级别的检索策略  
一对多和多对多关联的检索策略  

lazy属性  
outer-join属性  
检索策略  
false  
false  
采用立即检索,这是默认的检索策略,当使用Hibernate的第二级缓存时,可以考虑采用立即检索。  
true  
false  
采用延迟检索  
false  
true  
采用迫切左外连接检索,对于Hibernate2.0以下,再映射文件中如果有多个<set>元素,只允许有一个<set>元素的outer-join属性为true  
true  
true  
没有任何意义  


注意:对于Session.find()方法会忽略迫切左外连接检索,采用立即检索策略  
多对一和一对一关联的检索策略  
Order对象与Custom对象之间的多对一关系  

Order.hbml.xml  
<many-to-one>元素的  
outer-join属性  
Custom.hbm.xml<class>元素的lazy属性  
检索order对象时对关联的custom对象使用的检索策略  
auto  
true  
延迟检索  
auto  
false  
迫切左外连接检索  
true  
true  
迫切左外连接检索  
true  
false  
迫切左外连接检索  
false  
true  
延迟检索  
false  
false  
立即检索  


批量检索:  
设置<class>元素的batch-size,这样再进行查询时能够在Sql中采用or连接词,减少查询次数。
、提高查询性能:

1、尽量使用迫切连接,以减少查询数据库的次数。

2、对使用延迟加载或者立即检索策略设置批量 查询数目,以检索查询数据库的次数。

3、使用查询缓存

4、有的时候数据量较大,只负责显示的数据可使用Sql查询,以减少缓存空间。

5、尽量减少返回记录集字段的数目,只返回所需要的字段。

6、使用集合过滤,也就是说通过第一次查询的结果来再次进行查询。

二、HQL方式与QBC方式的不同

1、HQL方式功能强大,可实现分组,外连、内连,而QBC则没有这些功能。

2、HQL语句写法接近Sql语句方式,容易上手。

3、HQL语句无法在编译期检查错误。而QBC能够做到。

4、QBC是面向对象的,而HQL语句还不是面向对象编程。

5、QBC能够动态创建查询,而HQL不能

6、QBC提供了接口,扩展性好,HQL方式不具有扩展性。