博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[Hibernate] - EAGER and LAZY
阅读量:6713 次
发布时间:2019-06-25

本文共 1894 字,大约阅读时间需要 6 分钟。

Hibernate中的字段映射中的Fetch有两种方式:EAGER和LAZY

Eager:全部抓取

Lazy:延迟抓取

如果在字段中声明为Eager,那么在取得当前Bean时,同时会抓取Bean中的关联Bean值。即数据库查询多次。反之Lazy则在之后抓取提交查询。

 

比如,有如下声明为Eager的User Bean:

@OneToMany(mappedBy="user", cascade=CascadeType.ALL, fetch=FetchType.EAGER)    private Set
cards;

此时使用Join查询时,将会同时把User bean下的cards均一同查询出来:

// Left join            // ----------------------------------------------------            String hql = "SELECT U FROM User U LEFT JOIN U.cards C WHERE U.userName=:userName AND C.cardID=:cardID";            Query query = session.createQuery(hql);            query.setLong("cardID", 1);            query.setString("userName", "Robin");            List
users = query.list(); for (User user : users) { System.out.println("User ID:" + user.getUserID() + "\tUser name:" + user.getUserName()); }

输出的SQL和查询结果:

 

如果把Eager修改为Lazy:

@OneToMany(mappedBy="user", cascade=CascadeType.ALL, fetch=FetchType.LAZY)    private Set
cards;

查询:

// ----------------------------------------------------            // Left join            // ----------------------------------------------------            String hql = "SELECT U FROM User U LEFT JOIN U.cards C WHERE U.userName=:userName AND C.cardID=:cardID";            Query query = session.createQuery(hql);            query.setLong("cardID", 1);            query.setString("userName", "Robin");            List
users = query.list(); for (User user : users) { System.out.println("User ID:" + user.getUserID() + "\tUser name:" + user.getUserName()); }

输出的SQL和查询结果:


 

 

当然,大多数情况下,bean的设计都应该为Lazy。

因为如果真要同步查询得到关联对象bean的值,可以在hql中加入FETCH关键字即可完成。

Fetch参考例子:

使用FETCH,如上查询hql可以写为:

String hql = "SELECT U FROM User U LEFT FETCH JOIN U.cards C WHERE U.userName=:userName AND C.cardID=:cardID";

 

转载地址:http://uuelo.baihongyu.com/

你可能感兴趣的文章
AngularJs创建省,市,区的3级列表
查看>>
wp7 独立存储
查看>>
项目UML设计(团队)
查看>>
Divideing Jewels
查看>>
洛谷P4169 天使玩偶 (算竞进阶习题)
查看>>
11周
查看>>
Order By操作
查看>>
东北证券——“智能报表系统”的建设经验
查看>>
十分钟理解Gradle
查看>>
Mysql复习大全(转)
查看>>
回到上次目录、历史命令查找快捷方式及执行时间显示设置、查看系统版本
查看>>
略论软件模块的加载策略
查看>>
siege 输出结果 理解
查看>>
C语言学习趣事_20_Assert_Setjmp
查看>>
Cogs 1672. [SPOJ375 QTREE]难存的情缘 LCT,树链剖分,填坑计划
查看>>
同一个工程下使用多个.C文件的设计(模块化设计)
查看>>
java贪吃蛇
查看>>
history
查看>>
LeetCode-4Sum
查看>>
GraphicsMagick安装&make命令使用
查看>>