Hibernate小记

1 讲讲一下orm框架 以及各个orm框架的区别

答:o---Object对象。r---关系数据库。m---映射文件。用对象的方式去操作关系数据库(原来是sql语句)

orm类型 映射关系 开发效率 数据库移植
hibernate: 全自动 实体类和数据库 自动生成sql 不同数据库类型的支持
ibatis: 半自动 实体类和SQL语句 需要编写具体的sql 标准SQL方便移植

2 hibernate 的原理及其步骤
答:1.读取配置(Configuration)*.cfg.xml。
2.使用Configuration创建SessionFactory(线程安全)。
3.使用SessionFactory创建Session(线程不安全,使用本地线程TheradLocal解决)。
SessionFactory提供了两种方式得到session。
3 说出Hibernate的核心类和接口:
答:
Configuration:管理从配置文件(*.cfg.xml)中读取的信息。
SessionFactory:根据配置信息创建一个SessionFactory实例。
Session:持久化方法是通过Session来完成的。

4 hibernate 实体的3种状态
答:
1.瞬时状态:这种状态一般都是刚new出来,
2.持久化状态:当数据与session产生关联后就由瞬时状态转变为持久化状态,
3.离线状态:这种状态曾经被持久化过,而且数据库中也与之有关联,但是当前session已经关闭,与Session已经没有任何的关联,

5 hibernate的几种查询方式 hibernate的sql查询接口是什么
答:
1.hql查询:hql是面向对象而不是面向数据库的查询,
hql支持两种查询方式:占位符(问号)与命名参数(冒号),不支持*操作,不适合动态查询。
2.sql查询:SQLQuery就是sql的查询接口,此时查询就是sql语句表名就是表名字段名就是字段名
也支持命名参数与占位符,但是它的移植性差。
3.qbc查询:Criteria是qbc的查询接口,这种查询方式不需要sql语句也不需要hql查询方法,不过对于太复杂的查询还是不建议使用,
通过Criteria使用Session创建出来的实例.add(Restrictions.eq("字段",条件))来进行条件查询。

6 什么是hibernate主键生成机制 举例说明
答:通过使用不同的主键机制而产生不同的主键性能。一般是策略模式

最常用的是native 由Hibernate根据使用的数据库自行判断采用 identity、hilo、sequence 其中一种作为主键生成方式。

7 阐述一下hibernate的映射 在关联映射中一对多 和 多对多 是如何实现的 要注意什么问题 
答:
映射分为四种:
1 基本类型的映射。
2 集合映射:加一个表,主键关联起来,1 list映射 有序可重复,2 set 无序不可重复,3 bag 无序可重复,4 map映射。
3 级联映射:1 一对一(one to one ),2 一对多(one to many),3 多对多(many to many)

8 hibernate的缓存是什么 用来干什么的 什么时候用什么方法刷新缓存 各种缓存里放的是什么东西 使用缓存应该注意什么
答:
1. 缓存是什么:缓存是介于物理数据源与应用程序之间,提高程序性能的一种方式

3. 一级缓存,是session共享级别的,hibernate内置的缓存,

4. 二级缓存,SessionFactory级共享,是放在配置文件中,

5. 查询缓存,Query,Criteria(查询缓存)由于命中率较低,所以hibernate默认是关闭的。

9 load与get save与persist saveorupdate与merge list与iterator 区别
答:它们的是把数据放入缓存中的。
1 load()(支持懒加载)根据id在查询时不会立即访问数据库,而是在需要使用时才会访问数据库,如果id不存在会报找不到id错误。
  get(不支持懒加载)根据id查询时会立即访问数据库,如果id不存在则返回null。

4 list它是一次性把所有的数据查询出来,而且会把查询出来的数据放入一级缓存中,也会放入二级缓存,会把读出来的数据放入查询缓存中,
但是不使用一级缓存,同样也不使用二级缓存,list会使用查询缓存。
iterator不会把查询出来的数据放入一级缓存中,也不会放入二级缓存,但是使用一级缓存,同样会使用二级缓存,不使用查询缓存,

项目中用list与iterator:先使用list查询,因为它会把查询出来的数据放入缓存中,然后使用iterator,它会去缓存中查找数据。

10 什么是懒加载(延迟加载) 懒加载用什么技术实现 如何解决session关闭导致的懒加载问题 解决的方案有缺点吗
答:
懒加载:1. 当具体确定用到某个数据时才会去加载数据库,
2. 懒加载使用的是代理技术来完成的,代理类就是加载对象的子类(系统定义的),如果把加载对象设置成final修饰那么就不能使用懒加载。
3. 当Session关闭时会造成懒加载的问题,可以使用OpenSessionInView模式来完成懒加载问题,通过过滤器来实现,

概念:1 lazy的概念,指在需要数据的时候才发出sql。

11 讲讲一下hibernate的抓取策略
答:
hibernate的抓取分为:抓取策略就是抓与当前对象有关联的实体或集合。
连接抓取 fetch="join":通过select语句使用外连接来加载其关联实体或集合。 
查询抓取 fetch="select":在查询当前班级表后会另外发送一条select语句抓取当前对象关联实体或集合。
子查询抓取 fetch="subselect":另外发送一条select语句抓取在前面查询到的所有实体对象的关联实体或集合,通过子查询in完成
批量抓取(batch-size="数量"):给的数量是多少就一次抓取多少条记录(前提是数据库中有那么多记录)。
12 hibernate如何处理大数据量 
答:
1.使用循环方法进行小量同步来清除缓存,当循环方法加载完指定的数量后就调用flush把数据同步到数据库,然后调用clear清除缓存。
通过该接口的操作会立刻发送给数据库,与JDBC的功能一样。
3.使用Query调用executeUpdate()执行批量更新,
4.使用分页机制,

13.说明是乐观锁,说明是悲观锁
乐观锁:在数据库中加一个version(版本号),字段属性为int,在读取数据时把版本号一同读出,在更新数据后数据库自动为版本号加1,
如果在更新过程中出现什么情况而没有及时提交,而此时另一个人对此数据进行了更新,更新完后版本号自动加1,
此时数据库中的版本号已经比之前读出的版本号大1,如果提交的版本号小于或等于数据库中的版本号那么就会报当前数据已过期。
* 为什么等于也过期呢?
* 因为提交时版本号会自动加1后再去与数据库中的版本号做比较。
悲观锁:锁住之后在没有提交之前任何人都改变不了原数据,但是有一个问题:在提交之后,
之前没提交时别人修改过但是没有修改成功的数据就会修改成功,使用LockMode.UPGRADE完成。

14 你是如何进行Hibernate的性能优化的
答:
在使用查询数据时第一次使用list方法查询,以后使用迭代方式查询,因为list查询它只会把数据放入缓存中而不会使用缓存,
迭代器查询出的数据它不会放入缓存但是会使用缓存,有一点注意,迭代器不使用查询缓存,list会使用查询缓存。

19 hibernate查询单条记录有几种方法
答:
唯一记录使用Session调用uinqueResult方法,当你确定本次查询只有一条记录可以用uinqueResult返回一个实体对象。
get方法 load方法。

20 你做项目为什么使用hibernate 为什么不使用hibernate
答:文档齐全,全自动的操作,自动生成sql等功能。
使用hibernate有几方面的好处,它的缓存机制可以为系统查询时节省资源,主键机制,自动生成sql等性能比较强,使用比较灵活,
而且hibernate还可以在不同数据库类型的支持,跨数据库的功能,与底层数据库分离,可移植。

不使用hibernate是因为在一些系统里数据量大或是更新比较频繁,而这些原因就会因为hibernate的缓存机制导致系统内存消耗过大,
系统性能下降,还有一些保密性较高的如:财务数据,私人信息等系统也不适合hibernate,不能使用sql的很多功能 存储过程等。

jdbc与hibernate不能共存,因为会导致hibernate的缓存失效。

21 用过hibernate注解吗 说出几个
答:
@Entity:标记为持久类映射
@Table:指定表名
@Id
@GeneratedValue
@GenericGenerator:主键生成机制
@OneToMany
@ManyToOne
@JoinColumn:关联字段


其它注解:
@Resource:标注在对象上,可以代替以前的set方法。
@Controller:表示action层。
@Service:表示service层。
@Repository:表示dao层。

22 hibernate为什么能跨数据库?
答:因为hibernate是ORM模式的框架,方言,实现了跨数据库的功能,根据配置的方言,产生不同的sql,使用URL通过元数据得到需要使用什么数据库。

使用hibernate碰到什么问题?
1. 大数据量问题。
2. hibernate最好不要与其它系统共存,如:JDBC。
3. 使用一级缓存的问题,当Session关闭后里面的数据就没有了,因为不能控制,所以要注意大批量操作数据时可能造成内存溢出。
4. 使用二级缓存的问题,要注意它的命中率,如果命中率太低对系统性能的消耗会很大。
5. 使用缓存都会有存在无效数据的问题,使用缓存应该注意查询要大于修改,而且数据量不要过大。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章