什么是Hibernate?
hibernate是一个基于ORM持久框架,可以让程序员以面向对象的思想操作数据库,提高生产效率.
什么是ORM?
orm不过是一种思想,对象关系映射。是对象关系模型,如hibernate,让你以面向对象的方式去编程。封装了JDBC.
说一下orm与jdbc的区别?
jdbc只是一个java操作数据库的规范接口而已
orm不过是一种思想,对象关系映射。
ORM:是对象关系模型,如hibernate,让你以面向对象的方式去编程。封装了JDBC.
JDBC:是从底层访问数据库服务器。一般银行,金融行业为了安全起见,直接用JDBC访问
Hibernate中get和load有什么不同之处?
load :找不到数据的话会抛出org.hibernate.ObjectNotFoundException异常。此时hibernate会使用延迟加载加载机制
get找不到的话会返回null。
如果查询不到数据,get 会返回 null,但是不会报错, load 如果查询不到数据,则报错ObjectNotFoundException
使用get 去查询数据,(先到一级/二级)会立即向db发出查询请求(select …), 如果你使用的是 load查询数据,(先到一级、二级))即使查询到对象,返回的是一个代理对象,如果后面没有使用查询结果,它不会真的向数据库发select ,当程序员使用查询结果的时候才真的发出select ,这个现象我们称为懒加载(lazy)
hibernate的三种状态?
在Hibernate中,对象有三种状态:临 时状态(Transient)、持久状态(Persistent)和游离状态(Detached)。
处于持久态的对象也称为 PO(PersistenceObject),临时对象和游离对象也称为VO(ValueObject).
hibernate的懒加载? 有几种禁用方法?
在Hibernate框架中,当我们要访问的数据量过大时,明显用缓存不太合适, 因为内存容量有限 ,为了减少并发量,减少系统资源的消耗,这时Hibernate用懒加载机制来弥补这种缺陷,但是这只是弥补而不是用了懒加载总体性能就提高了。
我们所说的懒加载也被称为延迟加载,它在查询的时候不会立刻访问数据库,而是返回代理对象,当真正去使用对象的时候才会访问数据库。
1.使用代理对象:Hibernate.initialize(“代理对象”);
2.在需要禁用懒加载的映射文件中显示的加入lazy = “false”
3.使用openSessionInView【需要借助于过滤器】 需要在web.xml文件中配置
hibernate有几种查询方式?
1、 属性查询2、 参数查询、命名参数查询3、 关联查询4、 分页查询5、 统计函数
Hibernate的优缺点?
- Hibernate的优缺点:
优点:1、程序更加面向对象;
2、提高了生产率;
3、方便移植(修改配置文件);
4、无侵入性。
缺点:
1、效率比JDBC略差;
2、不适合批量操作。
Hibernate的缓存机制
Hibernate缓存包括两大类:Hibernate一级缓存和Hibernate二级缓存。
1.Hibernate一级缓存又称为“Session的缓存”。
Session内置不能被卸载,Session的缓存是事务范围的缓存(Session对象的生命周期通常对应一个数据库事务或者一个应用事务)。
一级缓存中,持久化类的每个实例都具有唯一的OID。
2.Hibernate二级缓存又称为“SessionFactory的缓存”。
由于SessionFactory对象的生命周期和应用程序的整个过程对应,因此Hibernate二级缓存是进程范围或者集群范围的缓存,有可能出现并发问题,因此需要采用适当的并发访问策略,该策略为被缓存的数据提供了事务隔离级别。
第二级缓存是可选的,是一个可配置的插件,默认下SessionFactory不会启用这个插件。
Hibernate提供了org.hibernate.cache.CacheProvider接口,它充当缓存插件与Hibernate之间的适配器。
Hibernate延迟加载?
-
Hibernate2延迟加载实现:a)实体对象 b)集合(Collection)
-
Hibernate3 提供了属性的延迟加载功能 当Hibernate在查询数据的时候,数据并没有存在与内存中,当程序真正对数据的操作时,对象才存在与内存中,就实现了延迟加载,他节省了服务器的内存开销,从而提高了服务器的性能。
Hibernate工作原理及为什么要用?
原理:
-
读取并解析配置文件
-
读取并解析映射信息
-
创建SessionFactory
-
打开Sesssion
-
创建事务Transation
-
持久化操作
-
提交事务
-
关闭Session
-
关闭SesstionFactory
为什么要用:
-
对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。
-
Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作
-
hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。
-
hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。
请谈谈Hibernate悲观锁和乐观锁的原理和应用场景?
锁
业务逻辑的实现过程中,往往需要保证数据访问的排他性。如在金融系统的日终结算处理中,我们希望针对某个cut-off时间点的数据进行处理,而不希望在结算进行过程中(可能是几秒种,也可能是几个小时),数据再发生变化。此时,我们就需要通过一些机制来保证这些数据在某个操作过程中不会被外界修改,这样的机制,在这里,也就是所谓的“锁”,即给我们选定的目标数据上锁,使其无法被其他程序修改。
hibernate之悲观锁和乐观锁
悲观锁:
1.场景:A和B都想上厕所,但是A先进去了,那么B你只有等等。
2.原理:基于数据库锁机制,并发很安全,但对于长事务而言,这样的数据库开销往往无法承受。(等你一个人处理完,别人都等死了)
乐观锁:
1.场景:操作员A和操作员B都在对同一个银行账户做扣款操作时,先操作的A操作时,更新数据的同时,也会更新表中加的字段数据库版本Version的值(一般都是递增),提交时,会比对version数据版本号,只有大于之前旧数据版本号,才允许操作成功,否则操作驳回。
2.原理:大多数情况是基于外部系统的数据存储逻辑,并发时,都可操作数据,但最后提交未必都成功,即提交更新等操作时基于版本号。但因基于外部应用系统,可能会有脏数据更新到数据库;解决办法即,对加了乐观锁的存储过程,对外部应用系统开发,都可调用,但是不要将存储过程中的表对外开放操作。
Hibernate中的1级和2级缓存的使用方式以及区别原理(Lazy-Load的理解).
Hibernate缓存:一级缓存和二级缓存: http://www.cnblogs.com/200911/archive/2012/10/09/2716873.html
1)延迟加载 : 当程序执行getter方法获取时,才发送sql语句加载数据.
延迟加载给程序带来好处,但是要避免session过早关闭问题.
(1)load()和get()两个方法区别:
load()采用延迟加载机制,返回的是一个proxy代理对象
get()没有采用延迟加载,返回的是一个对象实例
(2)Hibernate.initialize(user): 可以强制user对象实例化
(3)hbm映射描述文件中,,,等元素, 都可以使用lazy属性,默认lazy=“true”,启用延迟加载.
2)缓存机制
Hibernate每次查询先去缓存中查找,没有才去数据库查询.
(1)一级缓存:
Session级别的缓存,缓存load,get出来的单个对象.默认开启.
使用同一个Session对象多次查询同一个User对象,只会发送一次SQL取数据库获取.
(2)二级缓存
SessionFactory级别的缓存.默认情况是关闭.
①首先在hibernate.cfg.xml中指定EhCache缓存策略.
②在src下添加ehcache.xml配置文件.
③在User.hbm.xml中添加<cache/>定义.
<cache usage="read-only"/>,如果涉及更新,使用read-write.
Hibernate的原理体系架构,五大核心接口,Hibernate对象的三种状态转换,事务管理。
参考答案:
http://blog.youkuaiyun.com/martinmateng/article/details/50879436
Hibernate的工作原理和体系结构:
http://hong0104.iteye.com/blog/760813
Hibernate事务管理:
http://xmllong.iteye.com/blog/1436769
转自:https://blog.youkuaiyun.com/qq_35393693/article/details/79891511