hibernate面试题

1.hibernate优点

①.对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。

②.Hibernate 是一个基于JDBC的主流持久化框架,是一个优秀的ORM 实现。他很大程度的简化DAO层的编码工作

③.hibernate 的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。

2.hibernate的缓存机制

Session提供了一级缓存的功能,默认总是有效的。Session并不会立即把这种改变提交到数据库,除非显示调用了Session的flush()方法或通过close()方法关闭Session。

SessionFactory级别的二级缓存是全局性的,所有的Session可以共享这个二级缓存。不过二级缓存默认是关闭的。一级缓存和二级缓存都是对整个实体进行缓存,不会缓存普通属性。

查询缓存是将HQL或SQL语句以及它们的查询结果作为键值对进行缓存,对于同样的查询可以直接从缓存中获取数据。查询缓存默认也是关闭的,需要显示开启。

3.hibernate查询数据方式

HQL、原生sql、条件查询QBC

4.hibernate如何处理并发问题

1)设置事务隔离级别。
Serializable:串行化。隔离级别最高
Repeatable Read:可重复读
Read Committed:已提交数据读
Read Uncommitted:未提交数据读。隔离级别最差
2)设置锁:乐观锁和悲观锁。
乐观锁:使用版本号或时间戳来检测更新丢失,在的映射中设置 optimistic-lock=”all”可以在没有版本或者时间戳属性映射的情况下实现 版本检查,此时Hibernate将比较一行记录的每个字段的状态 行级悲观锁:Hibernate总是使用数据库的锁定机制,从不在内存中锁定对象!只要为JDBC连接指定一下隔 离级别,然后让数据库去搞定一切就够了。类LockMode 定义了Hibernate所需的不同的锁定级别:LockMode.UPGRADE,LockMode.UPGRADE_NOWAIT,LockMode.READ;

5.Hibernate中GET和LOAD的区别

在hibernate中如果要从数据库中得到一个对象,通常有两种方式,一种是通过session.get()方法,另一种就是通过session.load()方法。

session.get 方法, 查询立即执行 , 返回类对象。

session.load 方法,默认采用延迟加载数据方式,不会立即查询,返回类子类对象其实是一个代理对象,这个代理对象只保存了实体对象的id值只有当我们要使用这个对象,得到其它属性时,这个时候才会发出sql语句,从数据库中去查询我们的对象。

6.Hibernate中持久化对象状态

OID 指与数据表中主键对应 PO类中属性

①瞬时态:不存在持久化标识OID,尚未与Hibernate Session关联对象

②持久态:存在持久化标识OID,与当前session有关联
③游离态:存在持久化标识OID,但没有与当前session关联,

原文地址:https://www.cnblogs.com/mcahkf/p/9228910.html