1. 为什么要使用 hibernate?
(1). 对JDBC做了轻量级的封装,简化了数据访问层编码。
(2). Hibernate是一个ORM框架,开发者可以使用面向对象的思想操作数据库,使用更加方便。
(4). hibernate映射很灵活,支持各种关系数据库,从一对一到多对多的各种复杂关系。
一对多,多对一,多对多:参考链接:Hibernate之关联关系映射(一对多和多对一映射,多对多映射)
2. 什么是 ORM 框架?
(Object Relation Mapping)对象关系映射,即通过类与数据库表的映射关系,将对象持久化到数据库中
3. hibernate 中如何在控制台查看打印的 sql 语句?
在hibernate.cfg.xml配置文件
4. hibernate 有几种查询方式?
Hibernate有3种查询数据的方式,分别是:HQL查询,SQL查询,条件查询
参考链接:https://blog.csdn.net/suneqing/article/details/47846947
HQL查询的几种方式
5. hibernate 实体类可以被定义为 final 吗?
可以将Hibernate的实体类定义为final类,但这种做法并不好。因为Hibernate会使用代理模式在延迟关联的情况下提高性能,如
果你把实体类定义成final类之后,因为 Java不允许对final类进行扩展,所以Hibernate就无法再使用代理了, 如此一来就限制了使
用可以提升性能的手段
6. 在 hibernate 中使用 Integer 和 int 做映射有什么区别?
(1)、返回数据库字段值是null的话,int类型会报错。int是基本数据类型,其声明的是变量,而null则是对象。所以hibernate实体建议
用Integer;
(2)、通过jdbc将实体存储到数据库的操作通过sql语句,基本数据类型可以直接存储,对象需要序列化存储。
7. hibernate 是如何工作的?
(1) 读取并解析配置文件
(2) 读取并解析映射信息,创建SessionFactory
(3) 打开Session
(4) 打开事务
(5) 持久化操作
(6) 提交事务
(7) 关闭Session
(8) 关闭SessionFactory
8. get()和 load()的区别?
(1) get()是立即查询,load()是懒加载;
(2) get如果没有找到会返回null, load如果没有找到会抛出异常;
(3) get会先查一级缓存, 再查二级缓存,然后查数据库,
load会先查一级缓存,如果没有找到,就创建代理对象, 等需要的时候去 查询二级缓存和数据库。
9. 说一下 hibernate 的缓存机制?
(1)一级缓存(Session缓存)
它可以在session范围内减少数据库的访问次数! 只在session范围有效! Session关闭,一级缓存失效
只要是持久化对象状态的,都受Session管理,也就是说,都会在Session缓存中
Session的缓存由hibernate维护, 如果想操作缓存内容,可以通过close/clear/evict清空缓存
(2) 二级缓存(SessionFactory缓存)
二级缓存所有的Session都可以使用
可以在hibernate的配置文件hibernate.cfg.xml自行配置是否开启
true
org.hibernate.cache.EhCacheProvider
二级缓存的使用参考:https://www.cnblogs.com/quchengfeng/p/4111812.html
10. hibernate 对象有哪些状态?
有3种状态:(1)临时/瞬时态;(2)持久态;(3)游离态
(1)刚实例化的对象,没有被持久化,不受Session管理
(2)持久化到数据库,在数据库有对应的数据,受Session管理,属性的改变会反映到数据库中
(3)当Session关闭以后,持久化对象就变成了游离态,不受Session管理,但是数据库有对应的数据
11. 在 hibernate 中 getCurrentSession 和 openSession 的区别是什么?
(1) getCurrentSession创建的Session会绑定到当前线程,而openSession不会;
(2) getCurroentSession创建的Session在事务提交或者回滚后会自动关闭,而openSession创建的Session需要手动关闭;
(3) 使用getCurroentSession需要在配置文件中进行事务配置
如果是本地事物,及JDBC一个数据库:
如果是全局事物,及jta事物、多个数据库资源或事物资源:
12. hibernate 实体类必须要有无参构造函数吗?为什么?
每个Hibernate实体类必须包含一个 无参数的构造器, 这是因为Hibernate框架要使用Reflection API,
通过调用Class.newInstance()来创建这些实体类的实例。如果在实体类中找不到无参数的构造器,
这个方法就会抛出一个InstantiationException异常