当前位置: 首页>后端>正文

hibernate相关面试题

1.hibernate运行原理:

hibernate里面提供了3个核心接口
Configuration、SessionFactory、Session
1、hibernate启动的时候利用Configuration读取xml配置文件
2、通过配置文件创建SessionFactory对象,初始化hibernate基本信息
3、获取session然后调用CRUD方法进行数据操作,hibernate会把我们的数据进行三种状态的划分,然后根据状态进行管理我们的数据,对应的发送SQL进行数据操作
4、关闭session,如果有事务的情况下,需要手动获取事务并开启,然后事务结束后提交事务。
5、在提交事务的时候,去验证我们的快照里面的数据和缓存数据是否一致,如果不一致,发送SQL进行修改

2.hibernate的get方法和load方法的区别

1、get和load都是利用主键策略查询数据,
2、get默认不使用懒加载机制,load默认要使用懒加载机制,所谓的懒加载就是我们这个数据如果不使用,hibernate就不发送SQL到数据库查询数据。
3、当查询数据库不存在的数据的时候,get方法返回null,load方法抛出空指针异常,
load方法采用的动态代理的方式实现的,我们使用load方法的时候,hibernate会创建一个该实体的代理对象,该代理只保存了该对象的ID,当我们访问该实体对象其他属性,hibernate就发送SQL查询数据封装到代理对象,然后在利用代理对象返回给我们实际的数据,

3.hibernate的数据三种状态

瞬时态(刚new出来的数据–内存有,数据库没有)
持久态 (从数据查询的,或者刚保存到数据库,session没关闭的, 数据库有,内存也有)
脱管态(数据库有,内存没有)

4.hibernate的缓存机制

一级缓存又叫session缓存,又叫事务级缓存,生命周期从事务开始到事务结束,一级缓存是hibernate自带的,暴力使用,当我们一创建session就已有这个缓存了。数据库就会自动往缓存存放,
二级缓存是hibernate提供的一组开放的接口方式实现的,都是通过整合第三方的缓存框架来实现的,二级缓存又叫sessionFactory的缓存,可以跨session访问。常用的EHcache、OScache,这个需要一些配置。

当我们每次 查询数据的时候,首先是到一级缓存查看是否存在该对象,如果有直接返回,如果没有就去二级缓存进行查看,如果有直接返回,如果没有在发送SQL到数据库查询数据, 当SQL发送查询回该数据的时候,hibernate会把该对象以主键为标记的形式存储到二级缓存和一级缓存,如果返回的是集合,会把集合打散然后以主键的形式存储到缓存。一级缓存和二级缓存只针对以ID查询的方式生效,get、load方法。

5.Hibernate如何延迟加载

当Hibernate在查询数据的时候,数据并没有存在与内存中,当程序真正对数据的操作时,对象才存在与内存中,就实现了延迟加载,他节省了服务器的内存开销,从而提高了服务器的性能。

6.save()、update()和saveorupdate()的区别

当new一个对象,可以使用save()或者是saveorupdate(),save就是insert一个对象;saveorupdate()是当没有主键的时候,就save(),当有主键的时候,就update();
我们只用saveorupdate()不就行了,为什么还有save()和update()呢?因为对象的id主键是可以有分配策略的,数据库里面可以不自动生成的,所以一个新的数据,虽然有id主键,但还是使用save()保存。

7.persist和save的区别

persist不保证立即执行,可能要等到flush,persist不更新缓存;
save, 把一个瞬态的实例持久化标识符,及时的产生,它要返回标识符,所以它会立即执行Sql insert;
使用 save() 方法保存持久化对象时,该方法返回该持久化对象的标识属性值(即对应记录的主键值);
使用 persist() 方法来保存持久化对象时,该方法没有任何返回值。

8.SessionFactory的作用

SessionFactory用于创建Session对象的工厂,SessionFactory通常在应用启动的时候创建,应用程序种代码用它获得Session对象。作为一个单个数据存储单元,是线程安全的,多个线程可用同一个SessionFactory。


https://www.xamrdz.com/backend/3rt1934932.html

相关文章: