hibernate懒加载
来源:互联网 发布:stringbuffer拼接json 编辑:程序博客网 时间:2024/05/16 00:32
一 懒加载
懒加载(Load On Demand)是一种独特而又强大的数据获取方法,是指程序推迟访问数据库,这样做可以保证有时候不必要的访问数据库,因为访问一次数据库是比较耗时的。
当我们查询一个对象的时候,在默认情况下,返回的只是该对象的普通属性,当用户去使用对象属性时,才会向数据库发出再一次的查询,这种现象我们称为lazy现象。
二 懒加载几种情况
首先我们要明确一点 Domain Object 是非final的,才能实现懒加载。解决懒加载的方法:
1 明确初始化
在session还没有关闭时,访问一次 xxx.getXxx(),强制访问数据库。或者 Hibernate.initialize(xxx)
2 openSessionView 这个往往需要过滤器配合使用(web程序)。
3 在ssh中,可以实现在service层,标注方式解决懒加载.
4 在对象映射文件中配置,lazy=“false”
三 懒加载问题解决方法
1 Hibernate.initialize(代理对象)
2 在department映射文件中加入lazy=“false”
<classname="Department"lazy="false">
3 openinsessionview解决(过滤器)
3.1 为什么通过openSessionInView来解决懒加载。
many-to-one的many这方,如果取消了懒加载,例如
<class name="Student" lazy="false">
那么hibernate就会在查询学生many方时,把它相互关联的对象也查询,这里我们可以看出,对select语句查询影响不大。
one-to-many的one的这方,如果取消了懒加载,例如
<set name="stus" cascade="save-update" lazy="false">
当你去查询一个部门的时候,我们看到:
Hibernate: select department0_.id as id0_0_, department0_.name as name0_0_ from Department department0_ where department0_.id=?
Hibernate: select stus0_.dept_id as dept3_1_, stus0_.id as id1_, stus0_.id as id1_0_, stus0_.name as name1_0_, stus0_.dept_id as dept3_1_0_ from Student stus0_ where stus0_.dept_id=?
会把该部门关联的学生全部返回,不管你使用否。
该方式缺点:session关闭会延迟。
四 懒加载测试代码
package com.hsp.view;import org.hibernate.Hibernate;import org.hibernate.Session;import org.hibernate.Transaction;import com.hsp.domain.Department;import com.hsp.domain.Student;import com.hsp.util.HibernateUtil;public class TestMain { /** * @param args */ public static void main(String[] args) { Student student1 = getStudent(); System.out.println(student1.getName()+" 所在部门=" +student1.getDept().getName()); } //获取某个学生 public static Student getStudent() { // TODO Auto-generated method stub //通过获取一个sesion,让hibernate框架运行(config->加载hibernate.cfg.xml) Session s=null; Transaction tx=null; Student student1=null; try { //我们使用基础模板来讲解. s=HibernateUtil.getCurrentSession(); tx=s.beginTransaction(); //查询3号学生 student1=(Student) s.get(Student.class, 2); //显示初始化代理对象 Hibernate.initialize(student1.getDept()); tx.commit(); } catch (Exception e) { if(tx!=null){ tx.rollback(); } }finally{ if(s!=null && s.isOpen()){ s.close(); } } return student1; }}
五 测试结果
Hibernate: select student0_.id as id0_0_, student0_.name as name0_0_, student0_.dept_id as dept3_0_0_ from Student student0_ where student0_.id=?
Hibernate: select department0_.id as id1_0_, department0_.name as name1_0_ from Department department0_ where department0_.id=?
林冲8 所在部门=人事部8
阅读全文
0 0
- hibernate 懒加载、延时加载
- Hibernate懒加载特性
- Hibernate懒加载策略
- Hibernate懒加载策略
- Hibernate懒加载简述
- hibernate懒加载问题
- hibernate一对一懒加载
- hibernate懒加载
- Hibernate懒加载详解
- Hibernate懒加载
- hibernate懒加载
- Hibernate懒加载解析
- hibernate的懒加载
- HIBERNATE懒加载
- hibernate懒加载问题
- hibernate 懒加载
- Hibernate懒加载解析
- Hibernate懒加载解析
- 腾讯与重庆网信办达成战略合作 助力重庆网络安全事业发展
- [树链剖分+李超线段树] BZOJ4515: [Sdoi2016]游戏
- 二叉堆(Binary Heap)
- Bailian2690 首字母大写【字符串】
- matlab 读取子文件夹下的所有图片
- hibernate懒加载
- CSS的id选择器
- 旅行,紫书P269UVa1347(DP)
- Hibernate缓存
- CSS的群组选择器
- 用hashmap来模拟缓存实现的机制
- CSS的通配选择器
- AS3.0导入项目卡在下载gradle问题
- matlab制作caffe训练集和测试集的标签文件tran.txt val.txt