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. Morpheus

    https://software.broadinstitute.org/morpheus/

  2. WSL调用Windows下的ParaView对OpenFOAM进行后处理

    OpenFOAM可以在windows下的Linux子系统(WSL)安装,但是很麻烦的一个问题是WSL没有图形化的界面,只有一个控制台窗口,在后处理的过程中我们就没有办法直接调用paraFoam命令启动 ...

  3. eclipse修改代码没用、debug无法进断点、

    设置eclipse自动编译代码 处理tomcat不进断点问题 添加需要debug的项目 以上操作还是不行的话   可以把tomcat删除重新添加试试看

  4. kafka如何实现高并发存储-如何找到一条需要消费的数据(阿里)

    阿里太注重原理了:阿里问kafka如何实现高并发存储-如何找到一条需要消费的数据,kafka用了稀疏索引的方式,使用了二分查找法,其实很多索引都是二分查找法  二分查找法的时间复杂度:O(logn) ...

  5. java对象生成随意属性值

    public class RandomObjectValue { public static <T> T getObject(Class<?> clazz) { T t = n ...

  6. 11 JavaScript Utility Libraries you Should Know in 2019

    11 Useful Javascript utility libraries to speed your development.

  7. git修改提交作者和邮箱

    作用一名程序员,我们会经常混迹与不同的代码仓库,时常不同仓库会有作者信息验证.比如公司内建的gitlab一般会要求统一使用公司内部的域账号签名:github要求使用github账号签名等.因此,很容易 ...

  8. HSBImageView--android--可以设置HSB值的imageview

    package guide.yunji.com.guide.view; import android.content.Context; import android.content.res.Typed ...

  9. deformable conv

    在原feature map上经过卷积生成与原feature map一样w.h大小的feature map,但是channel变为2倍,即2N.2N代表的是每个像素x.y两个方向的偏移量. 这个偏移量生 ...

  10. NLP基本模型

    textcnn: 加载预训练词典:https://blog.csdn.net/nlpuser/article/details/83627709 构建textcnn网络:https://blog.csd ...