HelloCoder HelloCoder
首页
《Java小白求职之路》
《小白学Java》
计算机毕设
  • 一些免费计算机资源
  • 脚手架工具
  • 《从0到1学习Java多线程》
  • 《从0到1搭建服务器》
随笔
关于作者
首页
《Java小白求职之路》
《小白学Java》
计算机毕设
  • 一些免费计算机资源
  • 脚手架工具
  • 《从0到1学习Java多线程》
  • 《从0到1搭建服务器》
随笔
关于作者
  • 《LearnJavaToFindAJob》

    • 导读

    • 【初级】6~12k档

      • Java基础

      • JVM

      • 牛客网题库

      • MySQL

      • Linux

      • 计算机网络

      • 操作系统

      • Java框架

        • Hibernate面试题
        • Mybatis面试题
        • Redis面试题
        • Servlet的生命周期
        • Spring

        • SpringBoot

        • SpringCloud

        • Spring拦截器和过滤器有什么区别?
        • Struts面试题
    • 【中级】12k-26k档

    • 【高级】26k+档

    • 大厂面试题

    • 求职建议

    • 面经

  • LearnJavaToFindAJob
  • 【初级】6~12k档
  • Java框架
#Hibernate #面试题
码农阿雨
2022-06-02
目录

Hibernate面试题

# 1、Hibernate的理解

Java的核心之一是面向对象设计,那么如何把数据库的数据封装成一个对象返回呢?如何把一个对象出局后保存到数据库呢?Java采用了jdbc来解决这个问题,但是数据量如何解决,也没有标准的模板来解决呢?这就是Hibernate的功能之一了。

Hibernate实现了Java对象与关系数据库记录的映射关系,简称ORM,像mybatis、jpa也是一种ORM框架。有了Hibernate,我们就不需要写jdbc代码了,直接调用hibernate的方法就可以了,比如save、get。对 JDBC 访问数据库的代码做了封装,简化了数据访问层繁琐的重复。

# 2、Hibernate运行过程和原理

简单运行过程如下:

配置Configuration 、产生SessionFactory、创建session对象、启动事务、完成CURD、提交事务、关闭session。

所以核心是:Configuration、SessionFactory、Session

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

# 3、Hibernate的数据三种状态

Hibernate把他所管理的数据划分为三种状态 瞬时的(刚new出来的数据–内存有,数据库没有) 不和数据库的数据有任何关联关系,在Hibernate中,可通过session的save()或 saveOrUpdate()方法将瞬时对象与数据库相关联,并将数据对应的插入数据库中,此时该瞬时对象转变成持久化对象.

持久的 (从数据查询的,或者刚保存到数据库,session没关闭的, 数据库有,内存也有) 处于该状态的对象在数据库中具有对应的记录,并拥有一个持久化标识。如果是用hibernate的delete()方法,对应的持久对象就变成瞬时对象,因数据库中的对应数据已被删除,该对象不再与数据库的记录关联。

当一个session执行close()或clear()、evict()之后,持久对象变成脱管对象,此时持久对象会变成脱管对象,此时该对象虽然具有数据库识别值,但它已不在HIbernate持久层的管理之下。

游离的 (数据库有,内存没有) 当与某持久对象关联的session被关闭后,该持久对象转变为脱管对象。当脱管对象被重新关联到session上时,并再次转变成持久对象。

在事务提交的时候,Hibernate去对比处于持久状态的数据是否发生改变,(快照区、一级缓存区),当我们会话结束前,对持久状态数据进行了修改的话,快照区的数据会跟着改变。当session提交事务的时候,如果发现快照区和一级缓存的数据不一致,就会发送SQL进行修改。

# 4、Hibernate的get方法和load方法的区别

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

# 5、Hibernate的缓存机制

hibernate分为2级缓存

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

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

# 6、Hibernate有哪几种查询数据的方式

3种

  • hql、
  • 条件查询QBC(Query By Criteria)
  • 原生sql (通过createSQLQuery建立)
阅读全文
×

(为防止恶意爬虫)
扫码或搜索:HelloCoder
发送:290992
即可永久解锁本站全部文章

解锁
#Hibernate#面试题
上次更新: 2025-02-21 06:04:57
最近更新
01
《LeetCode 101》
02-21
02
IDEA、Golang、Pycharm破解安装
02-21
03
《LeetCode CookBook》
02-21
更多文章>
Theme by Vdoing | Copyright © 2020-2025 码农阿雨
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式