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. MySQL数据库中文乱码问题

    mysql> select * from books; +-----+---------------------------------+---------+-------------+---- ...

  2. eggjs的参数校验模块egg-validate的使用和进一步定制化升级

    简单讲一下这个egg-validate egg-validate是基于parameter的. 安装 npm install --save egg-validate 启用 // config/plugi ...

  3. js回文数的四种判断方法

    目录 1. 字符串的转换 1.1 简单点,使用高阶函数来完成 1.2 从后往前循环字符串数组 1.3 以中间数为节点,判断左右两边首尾是否相等 2. 数字转换 2.1 求模得尾数,除10得整数 判断一 ...

  4. [linux]查看进程占用内存

    1.top -p 进程ID PID:进程的ID USER:进程所有者 PR:进程的优先级别,越小越优先被执行 NInice:值 VIRT:进程占用的虚拟内存 RES:进程占用的物理内存 SHR:进程使 ...

  5. 多线程--同步--方法块和同步块synchronized

    package com.sxt.syn; /** * 线程安全: 在并发时保证数据的正确性.效率尽可能高 * synchronized * 1.同步方法 * 2.同步块 * * */ public c ...

  6. Kafka架构与原理

    前言 kafka是一个分布式消息队列.具有高性能.持久化.多副本备份.横向扩展能力.生产者往队列里写消息,消费者从队列里取消息进行业务逻辑.一般在架构设计中起到解耦.削峰.异步处理的作用. kafka ...

  7. 在 Windows 服务中托管 ASP.NET Core

    众所周知,ASP.NET Core采用了和传统ASP.NET不同的托管和HTTP处理方式,即把服务器和托管环境完全解耦.ASP.NET Core内置了两个HTTP服务器实现,一个是基于libuv实现的 ...

  8. ubuntu 本地生成被浏览器信任的证书

    vhosts添加https证书两步: 1:生成证书: sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl ...

  9. mp4文件转码为m3u8

    https://bbs.csdn.net/topics/392046401 *********************************************** 转码完成,我直接播放m3u8 ...

  10. 用python批量下载图片

    一 写爬虫注意事项 网络上有不少有用的资源, 如果需要合理的用爬虫去爬取资源是合法的,但是注意不要越界,前一阶段有个公司因为一个程序员写了个爬虫,导致公司200多个人被抓,所以先进入正题之前了解下什么 ...