Hibernate常见面试题和答案

1. 为什么要使用 hibernate?

           (1). 对JDBC做了轻量级的封装,简化了数据访问层编码。
           (2). Hibernate是一个ORM框架,开发者可以使用面向对象的思想操作数据库,使用更加方便。
           (4). hibernate映射很灵活,支持各种关系数据库,从一对一到多对多的各种复杂关系。

           一对多,多对一,多对多:参考链接:Hibernate之关联关系映射(一对多和多对一映射,多对多映射)

2. 什么是 ORM 框架?            

           (Object Relation Mapping)对象关系映射,即通过类与数据库表的映射关系,将对象持久化到数据库中

3. hibernate 中如何在控制台查看打印的 sql 语句?

            在hibernate.cfg.xml配置文件    <property name="show_sql">true</property>

            

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自行配置是否开启        

<property name="hibernate.cache.use_second_level_cache">true</property>

<property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>

       二级缓存的使用参考: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一个数据库:

                <propety name=”Hibernate.current_session_context_class”>thread</propety>

               如果是全局事物,及jta事物、多个数据库资源或事物资源:

               <propety name=”Hibernate.current_session_context_class”>jta</propety>

12. hibernate 实体类必须要有无参构造函数吗?为什么?

              每个Hibernate实体类必须包含一个 无参数的构造器, 这是因为Hibernate框架要使用Reflection API,

      通过调用Class.newInstance()来创建这些实体类的实例。如果在实体类中找不到无参数的构造器,

      这个方法就会抛出一个InstantiationException异常

  • 1
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值