hibernate2

延迟加载
什么是延迟加载
.在使用某些hibernate方法查询数据时,hibernate返回的只是一个空对象(除id外属性都为
null),并没有真正查询数据库,而在使用这个对象时才会触发查询数据库,并将查询到的数据
注入到这个空对象中,这种查询时间推迟对象访问时的机制称之为延迟加载

为什么要用延迟加载
.提升用户体验感
.可以提升内存资源的使用率
.可以降低对数据库的访问次数

采用了延迟加载的方法
.session.load();
.关联映射中对关联属性的加载

使用延迟加载需要注意的问题
.采用具有延迟加载机制的操作,需要避免session提前关闭,避免在使用对象之前关闭session.

--练习:验证延迟加载
设计案例:验证session.load()方法在查询时使用的是延迟加载
解决方案:
1.先查询某条emp_h的某条数据
2.输出一条分割线
3.使用查询到的对象,比如输出当前这个对象的某些属性
4.观察控制台,如果查询用的SQL语句在分割线后面,则证明该方法是使用延迟加载的
public void testLoad() {
        Session session = HibernateUtil.getSession();
//        load方法并没有触发访问数据库
        Emp_h emp = (Emp_h) session.load(Emp_h.class, 41);
        System.out.println("--------------");
//        使用emps对象时才真正访问数据库
        System.out.println(emp.getName());
        session.close();
    }
    
作业:
验证query.iterate()方法也是使用了延迟加载机制的.

open session in view
在项目中,DAO只是负责查询出数据,而使用数据的时机是在jsp解析的过程中,因此要避免在
DAO中关闭session,也就是说在视图层保持session的开启

延迟加载的实现原理:
采用延迟加载方法,返回的对象类型是Hibernate采用CGLIB技术在内存中动态生成的类型,
该类型为原实体类的子类,并在子类中重写了属性的get方法

关联映射
什么是关联映射
.若两张表具有关联关系,我们可以在实体对象和映射关系文件中配置这种关系,然后使用hibernate
操作其中一张表时,它可以通过配置关系自动的帮我们操作到另一张表,这种通过配置自动操作到
另一张表的手段称之为关联映射

关联映射的作用:
当我们操作一张表的时候,hibernate可以通过关联映射自动帮助我们操作
.这种关联操作包括
-关联查询出关系表的数据
-关联新增,修改关系表的数据
-关联删除关系表的数据


关系映射的类型
一对多关联
多对一关联
多对多关联
继承关联***

如何使用关联映射
1.明确两张表之间的关联关系
2.配置这种关系
3.配置的时候决定这种关系时哪种类型    
    
1.明确两张表的关系及关系字段
2.在实体类中添加关联属性
-在实体上体现两张表的关系,一般情况是在当实体类中增加一个属性,用于封装
其关系表的数据
3.在映射关系文件中配置关联关系    

一对多关联
什么是一对多关联
.如果2张表具有关联关系,并且关联关系的类型属于一对多,那么我们在使用hibernate操作
"一"方数据时,可以自动关联操作"多"方数据,那么这种关联映射称之为一对多关联

一对多关联的作用
.可以通过"一"来操作"多",包括
-通过查询"一",自动查询"多"
-通过新增/修改"一",自动新增/修改"多".
-通过删除"一",自动删除"多"

--练习:
使用一对多关联映射,在查询账务账号时,自动查询出他对应的全部业务账号
账务账号        ------         多个业务账号

解决方案:
1.账务账号与业务账号具有一对多的关系,他们的关系字段
账务表(Account)a类+List<service>            业务表(Service)
account_id    1                            service.account_id

2.在账户账号中追加集合属性,用于封装它对应的一组账号
3.在掌握账号映射关系文件中配置集合属性

步骤一:创建账务账号实体类.Account
步骤二:创建业务账号实体类.Service
步骤三:创建账务账号映射关系文件
步骤四:创建业务账号映射关系文件
步骤五:在主配置文件声明映射关系文件
步骤六:在账务账号实体类中追加集合属性
步骤七:测试

作业:多对一

hibernate的高级特性
二级缓存:二级缓存类似于一级缓存,可以缓存对象,但它是sessionFactory级别的缓存,
由sessionFactory负责管理,因此二级缓存的数据是session共享的,不同的session对象都可
以共享二级缓存中的数据

二级缓存适用场景
-对象数据频繁共享
-数据变化频率低

如何使用二级缓存
.导入ehcache.jar
.在src下添加缓存配置文件ehcache.xml
.在hibernate的主配置文件中开启二级缓存,指定采用的二级缓存驱动类
.在要缓存的对象对应的映射关系文件中.开启当前对象的二级缓存支持并指定存储策略

--练习:
在查询员工时,使用二级缓存,使得不同的session共享这些员工数据
解决方案:
步骤一:导入二级缓存驱动包
步骤二:引入二级缓存配置文件
步骤三:开启二级缓存,指定二级缓存驱动类.
步骤四:测试二级缓存
测试解决方案:
使用两个不同的session,查询同一条数据,查看控制台输出情况

查询缓存.
.什么是查询缓存
.查询缓存依赖于二级缓存,可以理解为特殊的二级缓存,也是sessionFactory级别的,也是
由sessionFactory负责维护.
.查询缓存可以缓存任何查询到的结果
.查询缓存以hql为key,缓存该hql查询到的整个结果,即如果执行2次同样的hql,那么第二次
执行时,此次查询可以从查询缓存中取到第一次查询缓存的内容

查询缓存的使用场景
频繁使用同样的sql做查询

如何使用查询缓存(三级缓存)
.开启二级缓存
.在hibernate.cfg.xml中开启查询缓存
.在查询代码执行前,指定开启查询缓存
PS:使用HQL语句进行全量查询,返回的结果不会放入一级缓存中
--练习:
在查询多条员工数据时,使用查询缓存,缓存查询的hql,使得再次使用同样的hql查询时,不必
重写访问数据库

步骤一:开启二级缓存
步骤二:开启查询缓存
步骤三:在查询代码执行前,指定开启查询缓存.
ps:查询缓存的key是hql的所对应的hql语句

//清空查询缓存
HibernateUtil.sessionFactory.evictQueries();

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值