- 浏览: 357756 次
- 性别:
- 来自: 广东珠海
文章分类
最新评论
-
cuiyijing:
[size=small]马士兵 26_homework_dml ...
SQL面试题 -
utobe:
兄弟 你真的出名了,尚学堂 oracle 马士兵的视频拿你的题 ...
SQL面试题 -
tlqtangok:
没看懂,能解释一下吗?
安装Oracle后java的jvm会报错 -
a114d:
itling 写道尚学堂的demo楼上威武
hibernate 全面学习【hibernate抓取策略 】 -
wohenshuaiba:
不错,但是没写return checkimg( this ); ...
图片上传
lazy策略可以用在:
* <class>标签上:可以取值true/false
* <property>标签上,可以取值true/false,这个特性需要类增强
* <set>/<list>等集合上,可以取值为true/false/extra
* <one-to-one>/<many-to-one>等标签上,可以取值false/proxy/no-proxy
重要的概念:
1、lazy的概念,指在需要的时候才发出sql
2、lazy策略只是在session打开期间才是有效的
注意:
Hibernate类级别的lazy加载策略:可以控制什么时候加载这些普通对象属性
测试单元的使用:
请先运行初时化程序InitData,在执行每个单元测试
Hibernate集合属性的懒加载策略:
在集合属性上,可以配置懒加载策略,取值为:true/false/extra
true:默认取值,它的意思是只有在调用这个集合获取里面的元素对象时,才发出查询语句,加载其
集合元素的数据
false:取消懒加载特性,即在加载对象的同时,就发出第二条查询语句加载其关联集合的数据
extra:一种比较聪明的懒加载策略,即调用集合的size/contains等方法的时候,hibernate并不会去加载整个集合的数据,而是发出一条聪明的SQL语句,以便获得需要的值,只有在真正需要用到这些集合元素对象数据的时候,才去发出查询语句加载所有对象的数据
Hibernate单端关联懒加载策略:即在<one-to-one>/<many-to-one>标签上可以配置
懒加载策略。
可以取值为:false/proxy/no-proxy
false:取消懒加载策略,即在加载对象的同时,发出查询语句,加载其关联对象
proxy:这是hibernate对单端关联的默认懒加载策略,即只有在调用到其关联对象的方法的时候
才真正发出查询语句查询其对象数据,其关联对象是代理类
no-proxy:这种懒加载特性需要对类进行增强,使用no-proxy,其关联对象不是代理类
注意:在class标签上配置的lazy属性不会影响到关联对象!!!
<hibernate-mapping> <class name="com.bjsxt.hibernate.Group" table="t_group"> <id name="id"> <generator class="native"/> </id> <property name="name"/> </class> </hibernate-mapping>
package com.bjsxt.hibernate; import org.hibernate.Session; import com.bjsxt.hibernate.Group; import com.bjsxt.hibernate.HibernateUtils; public class InitData { public static void main(String[] args) { Session session = null; try { session = HibernateUtils.getSession(); session.beginTransaction(); Group group = new Group(); group.setName("java开发组"); session.save(group); session.getTransaction().commit(); }catch(Exception e) { e.printStackTrace(); session.getTransaction().rollback(); }finally { HibernateUtils.closeSession(session); } } }
package com.bjsxt.hibernate; import org.hibernate.Session; import junit.framework.TestCase; /** * 运行本单元测试的前提条件: * 设置<class>标签中的lazy="true",或是保持默认(即不配置lazy属性) * * @author Administrator * */ public class ClassLazyTest extends TestCase { public void testLoadGroup1() { Session session = null; try { session = HibernateUtils.getSession(); //不会发出查询sql Group group = (Group)session.load(Group.class, 1); //不会发出查询sql System.out.println("group id=" + group.getId()); //发出查询sql,加载数据到Group System.out.println("group name=" + group.getName()); //不会发出查询sql System.out.println("group name=" + group.getName()); }catch(Exception e) { e.printStackTrace(); }finally { HibernateUtils.closeSession(session); } } public void testLoadGroup2() { Session session = null; Group group = null; try { session = HibernateUtils.getSession(); //不会发出查询sql group = (Group)session.load(Group.class, 1); }catch(Exception e) { e.printStackTrace(); }finally { HibernateUtils.closeSession(session); } //不能正常输出,抛出了 LazyInitializationException,因为session已经关闭了 //注意:Hibernate支持Lazy策略,只有session打开状态才有效 System.out.println("group name=" + group.getName()); } }
---------------------------------------------------------------------
集合类测试
<hibernate-mapping> <class name="com.bjsxt.hibernate.Classes" table="t_classes"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <!-- <set name="students" cascade="all" order-by="id"> --> <set name="students" lazy="extra"> <key column="classid"/> <one-to-many class="com.bjsxt.hibernate.Student"/> </set> </class> </hibernate-mapping> <hibernate-mapping> <class name="com.bjsxt.hibernate.Student" table="t_student"> <id name="id"> <generator class="native"/> </id> <property name="name"/> </class> </hibernate-mapping>
package com.bjsxt.hibernate; import java.util.Iterator; import java.util.Set; import org.hibernate.Session; import junit.framework.TestCase; /** * 保持lazy的默认值 * @author Administrator * */ public class CollectionLazyTest1 extends TestCase { public void testLoadClasses1() { Session session = null; try { session = HibernateUtils.getSession(); //不会发出查询sql Classes classes = (Classes)session.load(Classes.class, 1); //会发出一条查询sql,加载数据到classes System.out.println("班级:【" + classes.getName() + "】 拥有的学生:"); //不会发出查询sql Set students = classes.getStudents(); //会发出一条查询sql,加载数据到Students for (Iterator iter = students.iterator(); iter.hasNext();) { Student student = (Student)iter.next(); System.out.println(student.getName()); } }catch(Exception e) { e.printStackTrace(); }finally { HibernateUtils.closeSession(session); } } public void testLoadClasses2() { Session session = null; try { session = HibernateUtils.getSession(); //不会发出查询sql Classes classes = (Classes)session.load(Classes.class, 1); //会发出一条查询sql,加载数据到classes System.out.println("班级:【" + classes.getName() + "】 拥有的学生总数:"); //不会发出查询sql Set students = classes.getStudents(); //会发出一条查询sql,加载全部的数据到Students System.out.println(students.size()); }catch(Exception e) { e.printStackTrace(); }finally { HibernateUtils.closeSession(session); } } }
package com.bjsxt.hibernate; import java.util.Iterator; import java.util.Set; import org.hibernate.Session; import junit.framework.TestCase; /** * 设置集合上的lazy=false * @author Administrator * */ public class CollectionLazyTest2 extends TestCase { public void testLoadClasses1() { Session session = null; try { session = HibernateUtils.getSession(); //不会发出查询sql Classes classes = (Classes)session.load(Classes.class, 1); //会发出两条查询sql,加载数据到classes和Students中 System.out.println("班级:【" + classes.getName() + "】 拥有的学生:"); //不会发出查询sql Set students = classes.getStudents(); //不会发出查询sql for (Iterator iter = students.iterator(); iter.hasNext();) { Student student = (Student)iter.next(); System.out.println(student.getName()); } }catch(Exception e) { e.printStackTrace(); }finally { HibernateUtils.closeSession(session); } } public void testLoadClasses2() { Session session = null; try { session = HibernateUtils.getSession(); //不会发出查询sql Classes classes = (Classes)session.load(Classes.class, 1); //会发出两条查询sql,加载数据到classes和Students中 System.out.println("班级:【" + classes.getName() + "】 拥有的学生总数:"); //不会发出查询sql Set students = classes.getStudents(); //不会发出查询sql System.out.println(students.size()); }catch(Exception e) { e.printStackTrace(); }finally { HibernateUtils.closeSession(session); } } }
package com.bjsxt.hibernate; import java.util.Iterator; import java.util.Set; import org.hibernate.Session; import junit.framework.TestCase; /** * 设置集合上的lazy=extra * @author Administrator * */ public class CollectionLazyTest3 extends TestCase { public void testLoadClasses1() { Session session = null; try { session = HibernateUtils.getSession(); //不会发出查询sql Classes classes = (Classes)session.load(Classes.class, 1); //会发出一条查询sql,加载数据到classes System.out.println("班级:【" + classes.getName() + "】 拥有的学生:"); //不会发出查询sql Set students = classes.getStudents(); //会发出一条查询sql,加载数据到students for (Iterator iter = students.iterator(); iter.hasNext();) { Student student = (Student)iter.next(); System.out.println(student.getName()); } }catch(Exception e) { e.printStackTrace(); }finally { HibernateUtils.closeSession(session); } } public void testLoadClasses2() { Session session = null; try { session = HibernateUtils.getSession(); //不会发出查询sql Classes classes = (Classes)session.load(Classes.class, 1); //会发出一条查询sql,加载数据到classes System.out.println("班级:【" + classes.getName() + "】 拥有的学生总数:"); //不会发出查询sql Set students = classes.getStudents(); //会发出一条较为智能的查询sql,如: //select count(id) from t_student where classid =? System.out.println(students.size()); }catch(Exception e) { e.printStackTrace(); }finally { HibernateUtils.closeSession(session); } } }
----------------------------------------------------------------
单端关联加载
<hibernate-mapping> <class name="com.bjsxt.hibernate.Group" table="t_group"> <id name="id"> <generator class="native"/> </id> <property name="name"/> </class> </hibernate-mapping> <hibernate-mapping> <class name="com.bjsxt.hibernate.User" table="t_user" > <id name="id"> <generator class="native"/> </id> <property name="name"/> <!-- <many-to-one name="group" column="relatedGroup" /> --> <many-to-one name="group" column="relatedGroup"/> </class> </hibernate-mapping>
package com.bjsxt.hibernate; import org.hibernate.Session; import junit.framework.TestCase; /** * 所有lazy的属性默认 * @author Administrator * */ public class SingleEndTest1 extends TestCase { public void testLoadUser() { Session session = null; try { session = HibernateUtils.getSession(); //不会发出查询sql User user = (User)session.load(User.class, 2); //会发出一条查询sql,转载数据到User System.out.println("user name=" + user.getName()); //不会发出查询sql Group group = user.getGroup(); //会发出一条查询sql,转载数据到Group System.out.println("related group=" + group.getName()); }catch(Exception e) { e.printStackTrace(); }finally { } } }
package com.bjsxt.hibernate; import org.hibernate.Session; import junit.framework.TestCase; /** * 将<class>标签中的lazy设置为false * @author Administrator * */ public class SingleEndTest2 extends TestCase { public void testLoadUser() { Session session = null; try { session = HibernateUtils.getSession(); //会发出一条查询sql,转载数据到User User user = (User)session.load(User.class, 2); //不会发出查询sql System.out.println("user name=" + user.getName()); //不会发出查询sql Group group = user.getGroup(); //会发出一条查询sql,转载数据到Group System.out.println("related group=" + group.getName()); }catch(Exception e) { e.printStackTrace(); }finally { } } }
package com.bjsxt.hibernate; import org.hibernate.Session; import junit.framework.TestCase; /** * 保持<class>标签中的lazy默认设置 * 将<many-to-one>标签中加入lazy=false * @author Administrator * */ public class SingleEndTest3 extends TestCase { public void testLoadUser() { Session session = null; try { session = HibernateUtils.getSession(); //会发出一条查询sql,转载数据到User User user = (User)session.load(User.class, 2); //不会发出查询sql System.out.println("user name=" + user.getName()); //不会发出查询sql Group group = user.getGroup(); //会发出一条查询sql,转载数据到Group System.out.println("related group=" + group.getName()); }catch(Exception e) { e.printStackTrace(); }finally { } } }
评论
4 楼
pengjunwu
2010-01-14
明显有些地方有错误的结论。。不要误导人。。。
要发就专业 严谨点吧 哥们
要发就专业 严谨点吧 哥们
3 楼
darkmagician
2008-12-08
2 楼
yanganq
2008-11-13
1 楼
fujianqiangbo
2008-10-10
发表评论
-
hibernate
2012-05-14 14:27 0<?xml version="1.0" ... -
hibernate 全面学习->hibernate 关联映射学习
2008-07-04 16:26 4865hibernate 关联映射学习包括 一对一,一对多,多对多 ... -
hibernate 全面学习【hibernate session学习】
2008-07-04 16:16 2143测试对象的生命周期: ... -
hibernate 全面学习【悲观锁和乐观锁 学习】
2008-07-04 16:12 1506乐观锁: 大多数基于数据版本(version)记录机制实现,一 ... -
hibernate 全面学习【hibernate抓取策略 】
2008-07-04 15:46 3998Hibernate抓取策略 默认fetch的配置,也就fet ... -
hibernate 全面学习【hibernate hsql语句学习 】
2008-07-04 15:31 4860Hibernate hql * 注意hql的大小写敏感性 ... -
hibernate 全面学习【hibernate 粗粒度分析 】
2008-07-04 15:16 1553Hibernate继承映射的第一 ... -
hibernate 全面学习【hibernate 集合映射】
2008-07-04 15:07 2604集合的映射 set list array map packag ... -
hibernate 全面学习【hibernate 复合主键映射】
2008-07-04 15:01 1809复合主键映射 通常将复合主键相关属性,单独抽取出来,建立一个 ... -
hibernate 全面学习 【hibernte 组件映射学习 】
2008-07-04 14:59 1119component(组件映射) 在hibernate中,c ... -
hibernate 全面学习 【hibernate 缓存学习 】
2008-07-04 14:26 1886hibernate 缓存分为一级缓存和二级缓存,及查询缓存 ... -
hibernate 全面学习 【hibernate 基本映射】
2008-07-04 14:16 1217Hibernate基本映射: 类-->数据库表 普通属 ... -
Hibernate createCriteria查询
2007-05-18 08:36 165751、创建一个Criteria实例 net.sf.hiberna ... -
hibernate中Query和Criteria的用法
2007-03-15 17:20 2950//Scenario 1: query all ... -
“generating artifacts"的解决!
2007-03-14 13:45 11620很多人在用myeclipse4.1.1对一个表生成映射文件的时 ... -
hibernate+spring学习例子
2007-02-26 15:00 1917看例子,来这习hibernate 和spring -
hibernate问题,贴上来
2007-02-26 11:06 2124(1)hibernate警告 Could no ... -
利用模板方式写一个管理hibernate 中session的方法
2007-02-23 09:41 3539package com.t48.hr.util; imp ... -
解快hibernate查询带中文乱码问题
2007-02-20 14:32 2403"from ManPo ma where ma.na ... -
Hibernate分页
2007-02-06 08:50 1495import org.hibernate.Query; imp ...
相关推荐
hibernate 中的lazy属性的使用
博文链接:https://llying.iteye.com/blog/221699
Hibernate 的 lazyload 在FLEX中的解决方法例子 用的是gilead 因为LIB包太大上传很慢所以被我删掉了。
博文链接:https://llying.iteye.com/blog/221700
Dwr+Hibernate的Lazy问题 解决了Hibernate延迟加载失效问题
Hibernate延时加载与lazy机制.docHibernate延时加载与lazy机制.doc
Hibernate环境搭建 Hibernate主要接口 Hibernate主要映射 Hibernate的lazy、fetch、cascade等策略 Hibernate性能优化
博文链接:https://llying.iteye.com/blog/221701
NULL 博文链接:https://xuwoool.iteye.com/blog/1306207
001 Hibernate 简介(开源 O/R 映射框架) 002 第一个 Hibernate 示例 003 hibernate 主要接口介绍 004 持久对象的生命周期介绍 005 query 接口初步 006 开源 O/R 映射框架内容回顾 ...029 hibernate 抓取策略
Hibernate fetch lazy cascade inverse 关键字
hibernate映射lazy策略hibernate查询语言hql
NULL 博文链接:https://afuer.iteye.com/blog/1508008
19.1.7. 使用延迟属性抓取(Using lazy property fetching) 19.2. 二级缓存(The Second Level Cache) 19.2.1. 缓存映射(Cache mappings) 19.2.2. 策略:只读缓存(Strategy: read only) 19.2.3. 策略:读/...
主要介绍了mybatis中延迟加载Lazy策略,需要的朋友可以参考下
NULL 博文链接:https://quicker.iteye.com/blog/662613
Hibernate 的延迟加载(lazy load)是一个被广泛使用的技术。这种延迟加载保证了应用只有在需要时才去数据库中抓取相应的记录。通过延迟加载技术可以避免过多、过早地加载数据表里的数据,从而降低应用的内存开销。...
Lazy
hibernate的类级别检索策略和检索策略的lazy、fetch、batch-size属性使用
Hibernate中Cascade和inverse的区别,讲解的很详细