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之加载策略和抓取策略的更多相关文章

  1. 【Hibernate 8】Hibernate的调优方法:抓取策略

    在上一篇博客中,介绍了Hibernate的缓存机制.合理的配置缓存,可以极大程度上优化Hibernate的性能.这篇博客,介绍另外一个调优方式:抓取策略. 一.什么是抓取策略 抓取策略(fetchin ...

  2. Hibernate检索策略(抓取策略)(Hibernate检索优化)

    一.查询方法中get方法采用策略是立即检索,而load方法采用策略是延迟检索,延迟检索是在使用数据时才发送SQL语句加载数据 获取延迟加载数据方式:1.使用的时候,如果Customer c=sessi ...

  3. 【Java EE 学习 48】【Hibernate学习第五天】【抓取策略】【二级缓存】【HQL】

    一.抓取策略. 1.hibernate中提供了三种抓取策略. (1)连接抓取(Join Fetch):这种抓取方式是默认的抓取方式.使用这种抓取方式hibernate会在select中内连接的方式获取 ...

  4. 029 hibernate抓取策略

    实例A引用实例B,B如果是代理的话(比如多对一关联中):如果遍历A的查询结果集(假设有10条记录),在遍历A的时候,访问B变量,将会导致n次查询语句的发出!这个时候,如果在B一端的class上配置ba ...

  5. Hibernate(十四)抓取策略

    抓取策略: 抓取策略是当应用程序需要在(Hibernate实体对象图的)关联关系间进行导航的时候,Hibernate如何获取关联对象的策略.Hibernate的抓取策略是Hibernate提升性能的一 ...

  6. hibernate抓取策略

    抓取策略(fetching strategy) 是指:当应用程序需要在(Hibernate实体对象图的)关联关系间进行导航的时候, Hibernate如何获取关联对象的策略.抓取策略可以在O/R映射的 ...

  7. Hibernate中的多表查询及抓取策略

    1.Hibernate中的多表查询 1.1SQL中的多表查询 [交叉连接] select * from A,B; [内连接] 显示内连接:inner join(inner 可以省略) Select * ...

  8. Hibernate fetching strategies(抓取策略)

    抓取策略(fetching strategies)是指:当应用程序需要在(Hibernate实体对象图的)关联关系间进行导航的时候,Hibernate如何获取关联对象的策略.抓取策略可以在O/R映射的 ...

  9. 【Hibernate学习】 —— 抓取策略(注解方式)

    当应用程序须要在关联关系间进行导航的时候.hibernate怎样获取关联对象的策略. 抓取策略的方式: FetchType.LAZY:懒载入.载入一个实体时.定义懒载入的属性不会立即从数据库中载入. ...

随机推荐

  1. Default Activity Not Found解决方法

    2018年04月07日 17:22:44 Luckily_Liu 阅读数 13573更多 分类专栏: android   版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上 ...

  2. 【Python】解析Python中的线程与进程

    基础知识 线程 进程 两者的区别 线程的类型 Python 多线程 GIL 创建多线程 线程合并 线程同步与互斥锁 可重入锁(递归锁) 守护线程 定时器 Python 多进程 创建多进程 多进程通信 ...

  3. rabbitMQ消息队列 – Message方法解析

    消息的创建由AMQPMessage对象来创建$message = new AMQPMessage("消息内容");是不是很简单. 后边是一个数组.可以对消息进行一些特殊配置$mes ...

  4. github加速

    访问 https://www.ipaddress.com/ 找到以下网址对应的ip,在本地hosts里面映射,或者到路由器内映射好即可. github.com assets-cdn.github.co ...

  5. Ubuntu16.04安装Supervisor

    安装 sudo apt-get install supervisor 启动,否则会报 unix:///tmp/supervisor.sock no such file service supervis ...

  6. windows zip命令

    针对 Windows 用户的提示: win不自带zip,因此 Windows 用户可以从 GnuWin32 项目页面 上下载zip ,并将 C:\Program Files\GnuWin32\bin( ...

  7. [Go] 环境变量,模块化与基础语法

    [环境变量] 安装完 go 之后,设置必要环境变量: export GOPATH=/home/wc/go-lab export GO111MODULE=on export GOPROXY=https: ...

  8. flutter本地环境的安装以及编辑器的配置

    由于本文图片比较多,所有都缩小了不少,点击图片就可以放大看到原始图片 使用镜像 cmd打开终端,贴上以下代码,以加入到环境变量中,如果添加失败,可以手动添加 export PUB_HOSTED_URL ...

  9. 关于千里马招标网知道创宇反爬虫521状态码的解决方案(python代码模拟js生成cookie _clearence值)

    一.问题发现 近期我在做代理池的时候,发现了一种以前没有见过的反爬虫机制.当我用常规的requests.get(url)方法对目标网页进行爬取时,其返回的状态码(status_code)为521,这是 ...

  10. TomatoLog 是一个基于 .NETCore 平台的产品。

    TomatoLog TomatoLog 是一个基于 .NETCore 平台的产品. The TomatoLog 是一个中间件,包含客户端.服务端,非常容易使用和部署. 客户端实现了ILoggerFac ...