面试题汇总--hibernate

1、hibernate的三种状态:

     (一) 瞬时(临时)状态:   对象被创建时的状态,数据库里面没有与之对应的记录!    

  (二) 持久状态:   处于session的管理中,并且数据库里面存在与之对应的记录!

  (三) 游离状态:   对象不处于session的管理中,但是数据库里面存在与之对应的记录!

2、Hibernated的开发流程

        第一步:读取并解析配置文件。(加载Hibernate的配置文件,读取配置文件的参数)

        第二步:读取并解析映射信息,创建SessionFactory会话工厂(内部有连接池)

        第三步:打开Session 连接

        第四步:创建事务Transation

        第五步:运行操作(持久化操作)

        第六步:提交事务

        第七步:关闭session

        第八步:关闭连接池(SesstionFactory)
  

3、Hibernate的缓存机制

      (1)一级缓存(内部缓存存在Hibernate中,Session的缓存),属于应用事务级缓存。一旦事务结束,缓存随之失效。一个Session的生命周期对应一个数据库事务或一个程序事务。

      (2)二级缓存:(SessionFactory范围内的缓存)
              a) 应用及缓存
              b) 分布式缓存
                  条件:数据不会被第三方修改、数据大小在可接受范围、数据更新频率低、同一数据被系统频繁使用、非关键数据
              c) 第三方缓存的实现

4、Hibernate的查询方式

       常见有三种:HQL ,QBC(条件查询:QueryBy Criteria),原生SQL查询(通过createSQLQuery建立)

5、Hibernate和JDBC优缺点对比(及为什么要用hibernate)

      相同点:

            1)两者都是java数据库操作的中间件

            2)两者对数据库进行直接操作的对象都是线程不安全的,都需及时关闭

            3)两者都可以对数据库的更新操作进行显式的事务处理

     不同点:

            1)使用的SQL语言不同:JDBC使用是基于关系型数据库的标准SQL语言。HIbernate使用是HQL(Hibernate query language)语言

            2) 操作的对象不同:JDBC操作的是数据,将数据通过SQL语句直接发送的数据库中执行,Hibernate操作的是持久化对象,由底层持久化对象的数据更新到数据库中

            3)数据状态不同:JDBC操作的数据是“瞬时”的,变量的值无法与数据库中的值保持一致,而Hibernate操作的数据是可持久的,即持久化对象的数据的属性的值是可以跟数据库中的值保持一致的

 

*为什么要用hibernate:
         1)、 对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。

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

         3)、hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。

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

 

6、Hibernate 的优化

     1).数据库设计调整。( 表字段要少,表关联不要怕多,有二级缓存撑腰)

     2).HQL优化

     3).API的正确使用

     4).主配置参数(日志,查询缓存,fetch_sieze,batch_size)(配置对象缓存,不使用集合缓存)

     5).映射文件优化(ID生成策略,二级缓存,延迟加载,关联优化)(使用双向一对多关联,不使用单向一对多)

     6).一级缓存的管理

     7).针对二级缓存,还有许多特有的策略

     8).事务控制策略

7、Hibernate的五个核心接口

         (1)Configuration 接口:配置Hibernate,根据其启动hibernate,创建SessionFactory 对象;
         (2)SessionFactory 接口:初始化Hibernate,充当数据存储源的代理,创建session 对象,sessionFactory 是线程安全的,意味着它的同一个实例可以被应用的多个线程共享,是重量级、二级缓存;
         (3)Session 接口:负责保存、更新、删除、加载和查询对象,是线程不安全的,避免多个线程共享同一个session,是轻量级、一级缓存;
         (4)Transaction 接口:管理事务;
         (5)Query 和Criteria 接口:执行数据库的查询。

 

8、JDBC, hibernate 和 ibatis 的区别

jdbc:手动
       sql要手动写
       delete、insert、update:要将对象的值一个一个取出传到sql中,不能直接传入一个对象。
       select:返回的是一个resultset,要从ResultSet中一行一行、一个字段一个字段的取出,然后封装到一个对象中,不直接返回一个对象。
ibatis:半自动化
       sql要手动写
       delete、insert、update:直接传入一个对象
       select:直接返回一个对象
hibernate:全自动
       不写sql,自动封装
       delete、insert、update:直接传入一个对象
       select:直接返回一个对象

 

9、Hibernate是如何延迟加载?

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


10、Hibernate中怎样实现类之间的关系?(如:一对多、多对多的关系)

      类与类之间的关系主要体现在表与表之间的关系进行操作,它们都是对对象进行操作,我们程序中把所有的表与类都映射在一起,它们通过配置文件中的many-to-one、one-to-many、many-to-many

 

11、在数据库中条件查询速度很慢的时候,如何优化?

      1).建索引
      2).减少表之间的关联
      3).优化sql,尽量让sql很快定位数据,不要让sql做全表查询,应该走索引,把数据量大的表排在前面
      4).简化查询字段,没用的字段不要,已经对返回结果的控制,尽量返回少量数据

12、Hibernate的orm思想

      ORM指的是对象关系型映射,指的就是我们通过创建实体类对象和数据库中的表关系进行一一对应,来实现通过操作实体类对象来更改数据库里边的数据信息,这里边起到关键作用的是通过HIbernate的映射文件+Hibernate的核心配置文件

13、get和load的区别

          1). get是立即加载,

                  load是延时加载

          2). get会先查一级缓存,再查二级缓存,然后查数据库;

                  load会先查一级缓存,如果没找到,就创建代理对象,等需要的时候去查询二级缓存和数据库,(这里体现load的延迟加载的特性)

          3). get如果没有找到会返回null,

                  load如果没有找到会抛出异常

          4). 当我们使用session.load方法加载一个对象时,此时并不会发出SQL语句,当前得到的这个对象其实是一个代理对象。这个代理对象只保存了实体对象的id值,只有当我们使用这个对象,得到其它属性时,这个时候才会发出SQL语句,从数据库中去查询我们的对对象,相当于load的延迟加载方式。

                get就直接的多,当我们使用Session.get()方法来得到一个对象时,不管我们使不使用这个对象,此时都会发出SQL语句从数据库中查询出来

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值