zoukankan      html  css  js  c++  java
  • hibernate面试题

    难点为:session管理与性能优化。(性能优化是个经验活; 关于session管理,单纯的hibernate可以使用ThreadLocal来解决, 如果和spring结合,使用spring提供的session管理方案很不错。)

    1.load()和get()的区别

      两者都会先在缓存中查找对象,先一级缓存,再二级缓存。当没在缓存中找到对象时,若我们使用session.load(User.class,id)方法来加载一个对象时,此时并不会发出sql语句,当前得到的这个对象其实是一个代理对象,这个代理对象只保存了实体对象的id值,只有当我们要使用这个对象,得到其它属性时,这个时候才会发出sql语句,从数据库中去查询我们的对象。这个代理对象存在于一级缓存,以map的形式,此时id为map的key;get()就会离开查数据库。这样就能在某些情况下大幅度提高性能。

      若没在数据库中找到数据,get()会抛出NullPointException的异常;执行load()方法后,使用代理对象,会抛出ObjectNotFoundException异常;当我们只要看到控制台报LazyInitializationException这种异常,就知道是使用了load的方式延迟加载一个对象了(可能是得到代理对象后,还没有使用这个代理对象,即真正去查数据库,数据库就关闭了。),解决这个的方法有两种,一种是将load改成get的方式来得到该对象,另一种是在表示层来开启我们的session和关闭session。

    2.sorted collection 和ordered collection有什么区别

      sorted collection是在内存中通过java比较器进行排序的
      ordered collection是在数据库中通过order by进行排序的

    3.比较Hibernate的三种检索策略优缺点

      1立即检索;
    优点:对应用程序完全透明,不管对象处于持久化状态,还是游离状态,应用程序都可以方便的从一个对象导航到与它关联的对象;
    缺点:1.select语句太多;2.可能会加载应用程序不需要访问的对象白白浪费许多内存空间;
      2延迟检索:
    优点:由应用程序决定需要加载哪些对象,可以避免可执行多余的select语句,以及避免加载应用程序不需要访问的对象。因此能提高检索性能,并且能节省内存空间;
    缺点:应用程序如果希望访问游离状态代理类实例,必须保证他在持久化状态时已经被初始化;
      3 迫切左外连接检索
    优点:1对应用程序完全透明,不管对象处于持久化状态,还是游离状态,应用程序都可以方便地冲一个对象导航到与它关联的对象。2使用了外连接,select语句数目少;
    缺点:1 可能会加载应用程序不需要访问的对象,白白浪费许多内存空间;2复杂的数据库表连接也会影响检索性能;

    4.如何在控制台看到hibernate生成并执行的sql

      在定义数据库和数据库属性的文件applicationConfig.xml里面,把hibernate.show_sql 设置为true
      这样生成的SQL就会在控制台出现了
      注意:这样做会加重系统的负担,不利于性能调优

    5.hibernate都支持哪些缓存策略

      Read-only:  这种策略适用于那些频繁读取却不会更新的数据,这是目前为止最简单和最有效的缓存策略
      Read/write:这种策略适用于需要被更新的数据,比read-only更耗费资源,在非JTA环境下,每个事务需要在session.close和session.disconnect()被调用
      Nonstrict read/write: 这种策略不保障两个同时进行的事务会修改同一块数据,这种策略适用于那些经常读取但是极少更新的数据
      Transactional: 这种策略是完全事务化得缓存策略,可以用在JTA环境下

    6.Hibernate工作原理及为什么要用

      原理:
      1.读取并解析配置文件
      2.读取并解析映射信息,创建SessionFactory
      3.打开Sesssion
      4.创建事务Transation
      5.持久化操作
      6.提交事务
      7.关闭Session
      8.关闭SesstionFactory  

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

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

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

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

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

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

    8.Hibernate的缓存机制

      1. 内部缓存存在Hibernate中又叫一级缓存session,属于应用事物级缓存。

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

      SessionFactory的缓存又可以分为两类:内置缓存和外置缓存。Session的缓存是内置的,不能被卸载,也被称为Hibernate的第一级缓存。SessionFactory的内置缓存和   Session的缓存在实现方式上比较相似,前者是SessionFactory对象的一些集合属性包含的数据,后者是指Session的一些集合属性包含的数据。SessionFactory的内置缓  存中存放了映射元数据和预定义SQL语句,映射元数据是映射文件中数据的拷贝,而预定义SQL语句是在Hibernate初始化阶段根据映射元数据推导出来,SessionFactory的  内置缓存是只读的,应用程序不能修改缓存中的映射元数据和预定义SQL语句,因此SessionFactory不需要进行内置缓存与映射文件的同步。SessionFactory的外置缓存是一  个可配置的插件。在默认情况下,SessionFactory不会启用这个插件。外置缓存的数据是数据库数据的拷贝,外置缓存的介质可以是内存或者硬盘。SessionFactory的外置缓  存也被称为Hibernate的第二级缓存。

      3.第三方缓存的实现

    9.如何优化Hibernate

      1.使用双向一对多关联,不使用单向一对多
      2.灵活使用单向一对多关联
      3.不用一对一,用多对一取代
      4.配置对象缓存,不使用集合缓存
      5.一对多集合使用Bag,多对多集合使用Set
      6. 继承类使用显式多态
      7. 表字段要少,表关联不要怕多,有二级缓存撑腰

  • 相关阅读:
    java.net.SocketException: Unconnected sockets not implemented 解
    ios 瀑布流
    IOS --- 日期时间格式 更改
    平衡二叉树(常问问题)
    Oracle 学习笔记 17 -- 异常处理(PL/SQL)
    【Java先进】Lock、通过使用线程池
    兼容 谷歌、火狐、360系列浏览器桌面通知()有用
    iOS截取特定的字符串(正则匹配)
    改造世界、知行合一、实践论、学以致用
    如何理解“哲学家们只是用不同的方式解释世界,而问题在于改变世界”?
  • 原文地址:https://www.cnblogs.com/fanguangdexiaoyuer/p/5419538.html
Copyright © 2011-2022 走看看