hibernate 必会知识点总结

工作中用hibernate比较多,这里做一个系统的总结。

一,hibernate工作流程

1.读取并解析配置文件
2.读取并解析映射信息,创建SessionFactory
3.打开Sesssion
4.创建事务Transation
5.持久化操作
6.提交事务
7.关闭Session
8.关闭SesstionFactory
注意:其中sessionFactory是单例的,在服务启动时创建。

二,懒加载(延迟加载)

1.hibernate懒加载是怎么实现的?

懒加载是通过来代理机制(proxy)实现的。当hibernate从一个数据库中获取一个对象,对这个对象的集合属性,和关联对象,会使用一个代理对象来代表该对象,该对象的所有属性都有默认值,而并不是真正的请求数据库。只有当真正需要该属性值时,才从数据库中请求数据,从而实现延迟加载。

2.代码实例
User user=(User)session.load(clazz, id);//直接返回的是代理对象
System.out.println(user.getId());//没有发送sql语句到数据库加载
user.getName();//创建真实的User实例,并发送sql语句到数据库中

注意:1.不能判断User=null;代理对象不可能为空
代理对象的限制:和代理关联的session对象,如果session关闭后访问代理则抛异常。所以需要session关闭之前访问数据库。

3.默认使用延迟加载的时机
1.当从session上load()加载一个实体时
2.当session加载某个实体时,会对这个实体的集合属性采用延迟加载
3.当session加载某个实体时,会对这个实体单端关联的所有另一实体对象采用延迟加载

4.懒加载可能造成的问题
懒加载引起的最多的问题,就是session closed错误了。在session关闭后,再次访问代理对象的数据,便会报此错误。典型的场景是在对象从redis等缓存反序列化时。
那么就引出下个问题,session什么时候会关闭?

5.session关闭的时机
session的断开是在org.springframework.orm.hibernate.SessionFactoryUtils中处理的。
分为两种情况:
1.如果应用程序使用了OpenSessionInViewFilter或者OpenSessionInViewInterceptor,那么所有的打开过的session会注册在ThreadLocal里。在当前线程退出前, OpenSessionInViewFilter或者OpenSessionInViewInterceptor将会负责断开这些session。
2.如果应用程序没有应用OpenSessionInViewFilter或者OpenSessionInViewInterceptor,那么只要该session没有Transaction就直接关闭。否则在transaction结束后关闭。
那么怎么解决session is closed的问题的方法也有了。

6.解决session is closed报错
1.使用OpenSessionInViewFilter或者OpenSessionInViewInterceptor,使session保留在当前线程中
2.不实用懒加载(设置lazy=false)

三,hibernate三种状态及转化

hibernate中的对象存在三种状态:瞬时态,持久态,游离态。
1.当在代码中新创建一个对象时,此对象即为瞬时态,此时数据库中没有与之关联的数据。该对象不归hibernate session管理。
2.当在代码中使用session中save,saveOrUpdate,get,list,load等操作时,对象就处于持久化状态,此时数据库中有对应的数据,该对象被session关闭,对象属性的改变会引起数据库的改变。不必显式的调用save()方法。
3.当session关闭后,对象就变成了游离状态。此时对象不受session管理,但是数据库中有与之对应的数据。

四,hibernate三种检索策略

1.立即检索
即不使用懒加载,lazy=false;
所有的数据都被加载出来,会产品1+n类型的sql语句。
2.延迟检索
使用懒加载,lazy=true
只使用代理对象,减少数据的查询量,提高性能,不过要注意session is closed的问题。即获取代理对象的数据,需要保证在session关闭之前。
3.迫切左外连接检索
不使用懒加载,lazy=join;
使用连接查询,减少select语句,在关联大量表时会出现性能问题。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值