Java面试题-day18 Hibernate

1. Hibernate基础

1) Hibernate工作原理

  1. 通过Configuration对象读取并解析配置文件
  2. 读取并解析映射信息,创建SessionFactory对象
  3. 打开session
  4. 创建事务Transaction
  5. 持久化操作,对对象进行CRUD操作
  6. 提交事务
  7. 关闭session和SessionFactory对象

2) Hibernate优缺点

优点:

对 JDBC 访问数据库的代码做了封装,简化了数据访问层繁琐的重复性代码
映射的灵活性, 它支持各种关系数据库, 从一对一到多对多的各种复杂关系.
非侵入性、移植性会好
缓存机制: 提供一级缓存和二级缓存

缺点:
无法对 SQL 进行优化
框架中使用 ORM 原则, 导致配置过于复杂
执行效率和原生的 JDBC 相比偏差: 特别是在批量数据处理的时候
不支持批量修改、删除

3) 描述使用 Hibernate 进行大批量更新的经验. .

直接通过 JDBC API 执行相关的 SQl 语句或调用相关的存储过程是最佳的
方式

4) 在 Hibernate 中Java 对象的状态有哪些

临时状态(transient):不处于 Session 的缓存中,OID为null
持久化状态(persistent):加入到 Session 的缓存中。
游离状态(detached):已经被持久化,但不再处于 Session 的缓存中。

5) Session中一些重要方法的区别

session.save(obj); 保存一个对象

session.update(emp);更新一个对象

session.saveOrUpdate(emp);保存或者更新的方法:

					没有设置主键,执行保存;

有设置主键,执行更新操作;
如果设置主键不存在报错!

主键查询:
session.get(Employee.class, 1);
主键查询
session.load(Employee.class, 1);
主键查询 (支持懒加载)

6) Session的清理和清空有什么区别

清理缓存调用的是session.flush() 方法 .
清空调用的是session.clear()方法.
Session 清理缓存是指按照缓存中对象的状态的变化来同步更新数据库,但
不清空缓存;清空是把 Session 的缓存置空, 但不同步更新数据库;
7) Hibernate 的检索方式有哪些 ?
导航对象图检索 HQL 检索 QBC 检索本地 SQL 检索
8) 主键的生成策略
native 自增长【会根据底层数据库自增长的方式选择identity或sequence】
如果是mysql数据库, 采用的自增长方式是identity
如果是oracle数据库,使用sequence序列的方式实现自增长
increment 自增长(会有并发访问的问题,一般在服务器集群环境使用会存在问题。)
assigned 指定主键生成策略为手动指定主键的值
uuid 指定uuid随机生成的唯一的值
foreign (外键的方式, one-to-one)
9) Inverse属性
Inverse属性,是在维护关联关系的时候起作用的。
表示控制权是否转移。(在一的一方起作用)
Inverse , 控制反转。
Inverse = false 不反转;当前方有控制权
True 控制反转;当前方没有控制权
10) cascade 属性

cascade 表示级联操作【可以设置到一的一方或多的一方】
none 不级联操作,默认值
save-update 级联保存或更新
delete 级联删除
save-update,delete 级联保存、更新、删除
all 同上。级联保存、更新、删除

11) list与iterator查询的区别?

	list() 一次把所有的记录都查询出来,
会放入缓存,但不会从缓存中获取数据
		Iterator   N+1查询; N表示所有的记录总数
		即会先发送一条语句查询所有记录的主键(1),
再根据每一个主键再去数据库查询(N)!
会放入缓存,也会从缓存中取数据!

12) Hibernate的OpenSessionView问题

①. 用于解决懒加载异常, 主要功能就是把 Hibernate Session和一个请求的线程绑定在一起, 直到页面完整输出, 这样就可以保证页面读取数据的时
候 Session一直是开启的状态, 如果去获取延迟加载对象也不会报错。
②. 问题: 如果在业务处理阶段大批量处理数据, 有可能导致一级缓存里
的对象占用内存过多导致内存溢出, 另外一个是连接问题: Session 和数据库Connection 是绑定在一起的, 如果业务处理缓慢也会导致数据库连接得不到及时的释放, 造成连接池连接不够. 所以在并发量较大的项目中不建议使用此种方式, 可以考虑使用迫切左外连接 (LEFT OUTER JOIN FETCH) 或手工对关联的对象进行初始化。

13) Hibernate的缓存

Hibernate 缓存包括两大类:Hibernate一级缓存和Hibernate 二级缓存:

1)Hibernate 一级缓存又称为“Session 的缓存”,它是内置的,不能被
卸载。由于 Session 对象的生命周期通常对应一个数据库事务或者一个应用事务,因此它的缓存是事务范围的缓存。在第一级缓存中,持久化类的每个实例都具有唯一的 OID。
2)Hibernate 二级缓存又称为“SessionFactory 的缓存”,由于
SessionFactory 对象的生命周期和应用程序的整个过程对应,因此 Hibernate二级缓存是进程范围或者集群范围的缓存,有可能出现并发问题,因此需要采用适当的并发访问策略,该策略为被缓存的数据提供了事务隔离级别。第二级缓存是可选的,是一个可配置的插件,在默认情况下,SessionFactory 不会启用这个插件。当Hibernate根据ID访问数据对象的时候,首先从Session一级缓存中查;查不到,如果配置了二级缓存,那么从二级缓存中查;如果都查不到,再查询数据库,把结果按照 ID 放入到缓存删除、更新、增加数据的时候,同时更新缓存。HashtableCacheProvider

2. 映射关系

1) 一对多映射

部门方(一方)


员工方(多方)

2) 一对一映射

外键

主键


3) 多对多映射

全部评论

相关推荐

点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务