java之hibernate之加载策略和抓取策略
1.加载策略:指hibernate查询数据时,采用什么样的方式将数据写入内存。Hibernate中提供了两种方式来加载数据:懒加载和即时加载。
2.懒加载又称延迟加载,指使用hiberante API查询数据时,不会立即将数据写入内存。而是等到真正使用数据时才会发出sql语句,到数据中查询数据。
3.即时加载:指使用hibernate API查询数据时,会立即发出sql语句,查询数据。并将数据写入内存。
4.get方法是采用的即时加载,如果数据不存在,返回 null ,;load方法采用的懒加载,如果数据不存在,将抛出异常:ObjectNotFoundException 。
get 方法测试
@Test
public void testGet(){
Session session = HibernateUtil.getSession();
Book book = (Book)session.get(Book.class, 1);
System.out.println("------------------");
System.out.println(book.getName()+"---"+book.getAuthor());
HibernateUtil.close();
}
load 方法测试
@Test
public void testLoad(){
Session session = HibernateUtil.getSession();
Book book = (Book)session.load(Book.class, 8);
System.out.println("------------------");
System.out.println(book.getName()+"---"+book.getAuthor());
HibernateUtil.close();
}
5. list 方法是即时加载; iterate 是懒加载,先将要查询数据的主键查询出来,当真正使用数据时,根据 id 将数据查询出来,发出了n+1条sql语句。(1 和 n+1 问题)
list 方法测试
@Test
public void testList(){
Session session = HibernateUtil.getSession();
//使用hql语句 查询所有书籍 from后写的是类名称
List<Book> list = session.createQuery("from Book").list();
System.out.println("------------------");
System.out.println(list.size());
HibernateUtil.close();
}
Iterate 方法测试
@Test
public void testIterate(){
Session session = HibernateUtil.getSession();
//使用hql语句 查询所有书籍 from后写的是类名称
Iterator<Book> list = session.createQuery("from Book").iterate();
System.out.println("------------------");
while(list.hasNext()){
Book b=list.next();
System.out.println(b.getName()+"----"+b.getAuthor());
}
HibernateUtil.close();
}
注意:上面的测试方法,是通过观察打印出来sql语句与------的位置,来判断是懒加载还是即时加载的。
6.映射文件,标签上是lazy:
class 默认是懒加载的
property 默认是即时加载的
many_to_one 默认是 proxy 采用代理实现懒加载,如果是false , 在查询book时会将关联对象立即查出。no-proxy 懒加载
@Test
public void testManyToOne(){
Session session = HibernateUtil.getSession();
Book b = (Book)session.get(Book.class, 1);
System.out.println(b.getName()+"----"+b.getAuthor());
System.out.println("===============");
System.out.println(b.getCategory().getName());
HibernateUtil.close();
}
Set集合标签上 lazy 默认是true, 采用懒加载,false 表示即时加载,extra 智能的加载方式, 根据调用不同的方法执行不同的sql 语句。如果只查询大小,那么发出的sql是select count(XX) from table;
@Test
public void testSet(){
Session session = HibernateUtil.getSession();
Category c1 = (Category)session.get(Category.class, 1);
System.out.println(c1.getBooks().size());
System.out.println("------------------");
for(Book b:c1.getBooks()){
System.out.println(b.getName()+"---"+b.getAuthor());
}
HibernateUtil.close();
}
注意:懒加载必须在同一个session中,session 关闭后,懒加载不起作用。
7.抓取策略:抓取策略指在管理查询时,hibernate采用什么样的sql 语句进行查询,是采用select 还是采用 join。所以典型的抓取策略是select 抓取和join 抓取:
@Test
public void testSelect(){
Session session = HibernateUtil.getSession();
Book book = (Book)session.get(Book.class, 1);
System.out.println(book.getName()+"---"+book.getAuthor()+"---"+book.getCategory().getName());
HibernateUtil.close();
}
结果:
Hibernate:
select
book0_.id as id1_0_0_,
book0_.name as name2_0_0_,
book0_.author as author3_0_0_,
book0_.price as price4_0_0_,
book0_.pubDate as pubDate5_0_0_,
book0_.cid as cid6_0_0_
from
t_book book0_
where
book0_.id=?
Hibernate:
select
category0_.id as id1_1_0_,
category0_.name as name2_1_0_
from
t_category category0_
where
category0_.id=?
<many-to-one name="category" column="cid" fetch="join"/>
结果
Hibernate:
select
book0_.id as id1_0_0_,
book0_.name as name2_0_0_,
book0_.author as author3_0_0_,
book0_.price as price4_0_0_,
book0_.pubDate as pubDate5_0_0_,
book0_.cid as cid6_0_0_,
category1_.id as id1_1_1_,
category1_.name as name2_1_1_
from
t_book book0_
left outer join
t_category category1_
on book0_.cid=category1_.id
where
book0_.id=?
注意:当使用join抓取时,懒加载不起作用
java之hibernate之加载策略和抓取策略的更多相关文章
- 【Hibernate 8】Hibernate的调优方法:抓取策略
在上一篇博客中,介绍了Hibernate的缓存机制.合理的配置缓存,可以极大程度上优化Hibernate的性能.这篇博客,介绍另外一个调优方式:抓取策略. 一.什么是抓取策略 抓取策略(fetchin ...
- Hibernate检索策略(抓取策略)(Hibernate检索优化)
一.查询方法中get方法采用策略是立即检索,而load方法采用策略是延迟检索,延迟检索是在使用数据时才发送SQL语句加载数据 获取延迟加载数据方式:1.使用的时候,如果Customer c=sessi ...
- 【Java EE 学习 48】【Hibernate学习第五天】【抓取策略】【二级缓存】【HQL】
一.抓取策略. 1.hibernate中提供了三种抓取策略. (1)连接抓取(Join Fetch):这种抓取方式是默认的抓取方式.使用这种抓取方式hibernate会在select中内连接的方式获取 ...
- 029 hibernate抓取策略
实例A引用实例B,B如果是代理的话(比如多对一关联中):如果遍历A的查询结果集(假设有10条记录),在遍历A的时候,访问B变量,将会导致n次查询语句的发出!这个时候,如果在B一端的class上配置ba ...
- Hibernate(十四)抓取策略
抓取策略: 抓取策略是当应用程序需要在(Hibernate实体对象图的)关联关系间进行导航的时候,Hibernate如何获取关联对象的策略.Hibernate的抓取策略是Hibernate提升性能的一 ...
- hibernate抓取策略
抓取策略(fetching strategy) 是指:当应用程序需要在(Hibernate实体对象图的)关联关系间进行导航的时候, Hibernate如何获取关联对象的策略.抓取策略可以在O/R映射的 ...
- Hibernate中的多表查询及抓取策略
1.Hibernate中的多表查询 1.1SQL中的多表查询 [交叉连接] select * from A,B; [内连接] 显示内连接:inner join(inner 可以省略) Select * ...
- Hibernate fetching strategies(抓取策略)
抓取策略(fetching strategies)是指:当应用程序需要在(Hibernate实体对象图的)关联关系间进行导航的时候,Hibernate如何获取关联对象的策略.抓取策略可以在O/R映射的 ...
- 【Hibernate学习】 —— 抓取策略(注解方式)
当应用程序须要在关联关系间进行导航的时候.hibernate怎样获取关联对象的策略. 抓取策略的方式: FetchType.LAZY:懒载入.载入一个实体时.定义懒载入的属性不会立即从数据库中载入. ...
随机推荐
- Java编程思想之二 一切都是对象
2.1 用引用操作对象 每种编程语言都有自己的操作内存中元素的方式. 在Java中,一切都可以视为对象,因此可以采用单一的固定语法. 2.2 必须由你创建所有对象 一旦创建一个引用,就希望它能与一个新 ...
- SpringMVC(十六):如何使用编程方式替代/WEB-INF/web.xml中的配置信息
在构建springmvc+mybatis项目时,更常用的方式是采用web.xml来配置,而且一般情况下会在web.xml中使用ContextLoaderListener加载applicationCon ...
- MySQL索引原理(一)
MySQL索引原理 索引目的 索引的目的在于提高查询效率,可以类比字典,如果要查“mysql”这个单词,我们肯定需要定位到m字母,然后从下往下找到y字母,再找到剩下的sql.如果没有索引,那么你可能需 ...
- java 查找数组中最接近的一个数字
public static Integer getNumberThree(Integer[] intarray,Integer number){ int index = Math.abs(number ...
- grpc使用记录(二)简单同步服务实例
目录 1.编写proto文件,定义服务 2.编译proto文件,生成代码 3.编写服务端代码 server.cpp 代码 编译 4.编写客户端代码 client.cpp代码 5.简单测试一下 已经折腾 ...
- 两个字符串对比提升比较性能用 StringComparison.OrdinalIgnoreCase
如果用string.ToLower() 或者 string.ToUpper()字符串在进行大小写转换时会消耗额外的性能 用这个比较性能更好 StringPwd1.Equals(Md5(PassWord ...
- C语言 宏定义之可变参数
可变参数宏定义 C99编译器标准允许你可以定义可变参数宏(variadic macros),这样你就可以使用拥有可以变化的参数表的宏.可变参数宏就像下面这个样子: #define dbgprint(. ...
- asp.net core mvc 里的application中的start,end等事件
我们以前在用asp.net mvc或者webform的时候,经常用用到Application里的事件 start,end等.我们在.net core 里也同样有类似的方法. 在Startup类里,Co ...
- 僵尸进程bug排除方法
多进程处理存在的问题 直接return 200 子进程 signal.signal(signal.SIGCHLD, signal.SIG_IGN) #不管子进程,不然R的多进程切图会产生僵尸进程
- 浏览器查看和手动设置cookie的值
1.查看:按F12进入浏览器的开发者模式——console——在命令行输入javascript:alert(document.cookie),再回车 2.按F12进入浏览器的开发者模式——consol ...