有关hibernate的几个面试问题

来源:互联网 发布:微信打不开淘宝链接 编辑:程序博客网 时间:2024/05/01 12:17

1)hibernate的get(),load()问题
当在缓存中没有找到相应的对象时,get会直接访问数据库并返回完全初始化好的对象,而load在缓存无此对象时,只会返回一个代理对象,只有在getid()之外的其他方法被调用时才会真正访问数据库,在一定的情况下提高了性能;
其重要区别其指,在未能发现符合条件的对象时,get方法会返回null,而load方法会抛出ObjectNotFoundException。其load相当于一直相信数据库一定存在满足条件的数据,可使用代理来延迟加载,而其中存在问题则往外抛出异常;对于get方法,hibernate一定要获取真实数据,否则为null!

注:所谓的延迟加载为了避免无谓的一些性能开销而提出来,指当真正需要数据的时候才会真正的数据加载操作。

2)hibernate的二级缓存
二级缓存在SessionFactory级别维护的缓存,且二级缓存针对整个应用而不是某一个Session。
3)hibernate并发机制
(转)数据库事务的定义
数据库事务(Database Transaction),是指作为单个逻辑工作单元执行的一系列操作。一个逻辑工作单元要成为事务,必须满足所谓的ACID(原子性、一致性、隔离性和持久性)属性。
● 原子性(atomic),事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行
● 一致性(consistent),事务在完成时,必须使所有的数据都保持一致状态。
● 隔离性(insulation),由并发事务所作的修改必须与任何其它并发事务所作的修改隔离。
● 持久性(Duration),事务完成之后,它对于系统的影响是永久性的。

详见

http://blog.csdn.net/crazyitlhs/article/details/49446453

4)hibernate的save(),update()跟saveOrUpdate()区别
update()操作的对象时持久化的,其如果数据库中不存在,则不能使用此方法;
saveOrUpdate()操作的对象无约束,若是持久化的对象,调用该方法就执行更新数据,反之则进行一个数据的save。
save方法适合确定要插入数据,且需要得到插入数据的主键,其不能保存一个持久态或更新一个游离态数据,saveOrUpdate方法倾向不确定数据,且不需要得到它的主键,

5)hibernate的分页查询
exp:从第2000行开始查后50行数据:

Query q=session.createQuery("from 数据表 as xxx");q.setMaxResults(50);list list=q.list();q.setFirstResult(2000);

6)hibernate的sql跟hql查询的区别
1.sql针对的是面向数据表的查询
2.hql是面向对象的查询

exp:
sql:from 数据表 where后续加的是数据表中字段
hql:from 类名+类对象 where后续添加的是对象的属性作为条件

7)简谈hibernate的工作原理
读取并解析hibernate核心配置文件与映射文件
hibernate调用API
1.创建 Configuration对象
2.创建session工厂
3.通过工厂创建会话对象
4.获取事物对象
5.进行操作,提交,结束及关闭Session

8)hibernate的3种状态的理解及区别

hibernate的对象的三种状态分别称之为:transient(瞬态或自由态),persistent(持久态,及为数据库中记录相映的PO实例)
,detached(托管状态或游离态)

这里写图片描述

瞬态:某一个实例跟session都没有关系,即new出来的新实例
持久态:session中持久化了的实例,相当于数据库中的记录,修改数据其对应的数据库中数据也会改变
游离态:持久化对象脱离了Session的对象。如Session缓存被清空的对象。特点:已持久化,但不在Session缓存中。

0 0
原创粉丝点击