Hibernate框架学习笔记 lesson4
来源:互联网 发布:简洁视频网站源码 编辑:程序博客网 时间:2024/06/05 19:44
延迟加载(lazy)
根据主键查询 :
Emp emp = (Emp)session.get(Emp.class,1001); 立即加载,返回真实对象
Emp emp= (Emp)session.load(Emp.claa,1001); 延迟查询,并没用发送sql查询,在调用emp的get方法时查 询 ,返回代理子类对象,这样在需要的时候查询从而提升性 能
<class name="entity.Emp" table="emp" lazy="true"> lazy属性 默认为true
load(): 默认是延迟加载
返回的是代理对象 用了代理模式(会生成代理对象)
查询一个不存在的主键时,会报错
load实现原理:
Emp_javassist_0 extends Emp{
getEname(){
// 发送sql查询
}
}
get(): 立即加载 (没有用代理模式,不会有代理对象)
返回的是真实对象
查询一个不存在主键时,不会错,输出null
list(): 立即加载
iterator(): 延迟加载
Hibernate的对象状态 :
临时状态(瞬时状态) 临时对象 Transient随时有可能被回收器 刚刚new出来的 ,不处于Session的缓存中
在表中没有与之对应的记录.
Emp e = new Emp();
持久状态:Persistent
不能被回收的 表中有与之对应的记录 被session管理了(这个对象处于session缓存中)
session.save(e);
session.get(Emp.class,1001);
游离状态(托管状态):Detached
不在处于session缓存区了(不被session管理了)
在表中一般有与之对应的记录
可以被回收的
session.close();
session.clear();//将session缓存中的数据全部清空了
hibernate的缓存
提升性能将一个对象查询出来后,放入到缓存中,
下次再需要这个对象,就不需要在发送sql查询,直接在缓存中就查到.
1) 一级缓存: session级别缓存 默认就是开启的
session对象在 session缓存就存在
session关闭了 session缓存释放了
Session session = HibernateUtils.getSession();
Emp emp = (Emp)session.get(Emp.class, 1002);//发送sql查询 放入到session一级缓存中
System.out.println("------------------------");
Emp emp2 =(Emp)session.get(Emp.class,1002);//没有发送sql查询 而是直接从缓存中获取这个对象
System.out.println(emp==emp2);
HibernateUtils.closeSession();//session一级缓存就释放了
System.out.println("**********************************");
Emp emp3 = (Emp)HibernateUtils.getSession().get(Emp.class, 1002);//因为上面已经将session关闭了 所以缓存没有了 只能发送sql查询
//session.clear();//将缓存中的所有数据全部清空
session.evict(emp); //将指定的对象 从session一级缓存删除掉
evict(): 只清除指定的数据
clear():清空缓存中的所有数据
2)二级缓存 SessionFactory级别缓存 缓存范围更大
跨session缓存问题.
默认是关闭的
a.启用二级缓存 并且指定具体的提供商
<property name="cache.use_second_level_cache">true</property>
<property name="cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
b.在src下创建ehcache.xml
配置二级缓存具体管理办法:
<cache name="sampleCache1"
maxElementsInMemory="10000" 最大存储量
eternal="false" 永久不删除
timeToIdleSeconds="300" 不访问情况下的访问时间
timeToLiveSeconds="600" 存活时间
overflowToDisk="true" 是否支持往硬盘写
/>
c.在需要的*.hbm.xml:指定
<!-- 指定那个类需要二级缓存
usage:只读/读写
region:指定缓存的管理名字 空为默认
-->
<cache region="" usage="read-only"/>
Session session = HibernateUtils.getSession();
Emp emp = (Emp)session.get(Emp.class, 1003);//会放入到二级缓存中
HibernateUtils.closeSession();
Session session2= HibernateUtils.getSession();
Emp emp2 = (Emp)session2.get(Emp.class, 1003);//从二级缓存中获取数据
- Hibernate框架学习笔记 lesson4
- spring框架开发笔记 lesson4 注解开发
- springMVC框架开发笔记 lesson4 SSM实例
- C++学习笔记 lesson4 构造函数2
- hibernate框架学习笔记
- Hibernate框架入门(学习笔记)
- Hibernate框架学习笔记01
- Hibernate框架学习笔记02
- Hibernate框架学习笔记03
- Hibernate框架学习笔记04
- VC++笔记(Lesson1-Lesson4)
- lesson4
- lesson4
- lesson4
- Oracle数据库开发笔记 lesson4
- 学习Nehe Lesson2 && Lesson3 && Lesson4
- 【安卓学习笔记】JAVA基础Lesson4-函数重载与构造函数
- Hibernate框架笔记
- 计算机发展史
- MySQL 四种事务隔离级的说明
- iOS 开发:CocoaPods 安装及问题 ERROR: Error installing cocoapods: activesupport requires Ruby version>=2.2.2
- maven编译提示软件包找不到符号
- 单例模式中用volatile和synchronized来满足双重检查锁机制
- Hibernate框架学习笔记 lesson4
- 毕业生自传(冲锋陷阵)
- 看到此等app开发从业者,也挺无语的
- linux定时任务
- java实现文件下载
- 2.Flask基础-1
- 9.建造者模式
- Oracle删除表的几种方法
- Java之两个double 比较大小