Hibernate知识点
1.什么是Hibernate?
hibernate是一个基于ORM持久框架,可以让程序员以面向对象的思想操作数据库,提高生产效率.
2.什么是ORM?
orm不过是一种思想,对象关系映射。是对象关系模型,让你以面向对象的方式去编程,封装了JDBC.,是一种思想
3.说一下orm与jdbc的区别?
Jdbc:只是一个java操作数据库的规范接口而已,是从底层访问数据库服务器。一般银行,金融行业为了安全起见,直接用JDBC访问
Orm:建立了java对象与数据库之间的映射关系,让你以面向对象的方式去编程,直接操作java对象,封装了JDBC,代码量大大减少。
4.Hibernate中get和load有什么不同之处?
1)如果查询不到数据,
get:会返回null,但是不会报错,
load:会报错ObjectNotFoundException,hibernate会使用延迟加载加载机制
2)使用get去查询数据,会立即向db发出查询请求(select..),
如果你使用的是load查询数据,即使查询到对象,返回的是一个代理对象,
如果后面没有使用查询结果,它不会真的向数据库发select ,当程序员使用查
询结果的时候才真的发出select,这个现象我们称为懒加载(lazy)
5.hibernate的三种状态?
在Hibernate中,对象有三种状态:
1)临 时状态(Transient):刚new出来一个对象,还没有被保存到数据库中
2)持久状态(Persistent):已经被保存到数据库中
3)游离状态(Detached):数据库中有,但是session中不存在该对象
6.hibernate有几种查询方式?
1、属性查询
2、参数查询、命名参数查询
3、关联查询
4、分页查询
5、统计函数
7.Hibernate的优缺点?
优点:
1)程序更加面向对象;
2)提高了生产率;
3)方便移植(修改配置文件);
4)无侵入性。
缺点:
1)效率比JDBC略差;
2)不适合批量操作。
8.Hibernate的缓存机制
Hibernate的缓存机制只要有一级缓存和二级缓存
一级缓存:
1、使用一级缓存的目的是为了减少对数据库的访问次数,从而提升hibernate的执行效率;(当执行一次查询操作的时候,执行第二次查询操作,先检查缓存中是否有数据,如果有数据就不查询数据库,直接从缓存中获取数据);
2、Hibernate中的一级缓存,也叫做session的缓存,它可以在session范围内减少数据库的访问次数,只在session范围内有效,session关闭,一级缓存失败;
3、一级缓存的特点,只在session范围有效,作用时间短,效果不是特别明显,在短时间内多次操作数据库,效果比较明显。
4、当调用session的save/saveOrUpdate/get/load/list/iterator方法的时候,都会把对象放入session缓存中;
5、session的缓存是由hibernate维护的,用户不能操作缓存内容;如果想操作缓存内容,必须通过hibernate提供的evict/clear方法操作
6、缓存相关的方法(在什么情况下使用上面方法呢?批量操作情况下使用,如Session.flush();先与数据库同步,Session.clear();再清空一级缓存内容):
session.flush();让一级缓存与数据库同步;
session.evict();清空一级缓存中指定的对象;
session.clear();清空一级缓存中所有的对象;
二级缓存:
基于应用程序级别的缓存,作用在SessionFactory范围内的, 可以跨多个session,即不同的session都可以访问缓存。 Hibernate提供的二级缓存有默认的实现,且是一种可插配的缓存框架!如果用户想用二级缓存,只需要在hibernate.cfg.xml中配置即可; 不想用,直接移除,不影响代码。
1、在执行各种条件查询时,如果所获得的结果集为实体对象的集合,那么就会把所有的数据对象根据ID放入到二级缓存中。
2、当Hibernate根据ID访问数据对象的时候,首先会从Session一级缓存中查找,如果查不到并且配置了二级缓存,那么会从二级缓存中查找,如果还查不到,就会查询数据库,把结果按照ID放入到缓存中。
3、删除、更新、增加数据的时候,同时更新缓存。
(1)缓存的范围分为3类:
1)事务范围(单Session即一级缓存)
事务范围的缓存只能被当前事务访问,每个事务都有各自的缓存,缓存内的数据通常采用相互关联的对象形式.缓存的生命周期依赖于事务的生命周期,只有当事务结束时,缓存的生命周期才会结束.事务范围的缓存使用内存作为存储介质,一级缓存就属于事务范围.
2)应用范围(单SessionFactory即二级缓存)
应用程序的缓存可以被应用范围内的所有事务共享访问.缓存的生命周期依赖于应用的生命周期,只有当应用结束时,缓存的生命周期才会结束.应用范围的缓存可以使用内存或硬盘作为存储介质,二级缓存就属于应用范围.
3)集群范围(多SessionFactory)
在集群环境中,缓存被一个机器或多个机器的进程共享,缓存中的数据被复制到集群环境中的每个进程节点,进程间通过远程通信来保证缓存中的数据的一致,缓存中的数据通常采用对象的松散数据形式.
注意:
在通常情况下会将具有以下特征的数据放入到二级缓存中:
1)很少被修改的数据。
2)不是很重要的数据,允许出现偶尔并发的数据。
3)不会被并发访问的数据。
4)常量数据。
5)不会被第三方修改的数据
而对于具有以下特征的数据则不适合放在二级缓存中:
1)经常被修改的数据。
2)财务数据,绝对不允许出现并发。
3)与其他应用共享的数据
9.Hibernate延迟加载?有几种禁用方法?
当Hibernate在查询数据的时候,数据并没有存在于内存中,当程序真正对数据的操作时,对象才存在与内存中,就实现了延迟加载,他节省了服务器的内存开销,从而提高了服务器的性能。我们所说的懒加载也被称为延迟加载,它在查询的时候不会立刻访问数据库,而是返回代理对象,当真正去使用对象的时候才会访问数据库。
在Hibernate框架中,当我们要访问的数据量过大时,明显用缓存不太合适, 因为内存容量有限 ,为了减少并发量,减少系统资源的消耗,这时Hibernate用懒加载机制来弥补这种缺陷,但是这只是弥补而不是用了懒加载总体性能就提高了。
1.使用代理对象:Hibernate.initialize("代理对象");
2.在需要禁用懒加载的映射文件中显示的加入lazy = "false"
3.使用openSessionInView【需要借助于过滤器】 需要在web.xml文件中配置
10、Hibernate工作原理及为什么要用?
原理:
1)读取并解析配置文件:hibernate.cfg.xml
2)读取并解析映射信息:*.hbm.xml
3)创建配置管理器:Configuration configuration = new Configuration();
4)加载配置文件:configuration.configure();
5)创建SessionFactory:SessionFactory sf=configuration.buildSessionFactory();
6)打开Sesssion:Session session = sf.openSession();
7)创建事务Transation:
Transaction beginTransaction = session.beginTransaction();
8)提交事务:beginTransaction.commit();
9)关闭Session:session.close();
10)关闭SesstionFactory:sf.close();
为什么要用:
1)对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。
2) Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作
3) hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。
4) hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。