208面试题 Hibernate

十二、Hibernate

113.为什么要使用 hibernate?
  1. 对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。
  2. Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作
  3. hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。
  4. hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。
114.什么是 ORM 框架?

对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。

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

找到hibernate的配置文件-- hibernate.cfg.xml
添加:
< property name=“hibernate.show_sql”>true</ property>
如果你用的spring那么就要:
修改spring里面的配置文件:

< property name=“hibernateProperties”>
< props>
org.hibernate.dialect.MySQLDialect</ prop>
false</ prop>
< /props>
< /property>

116.hibernate 有几种查询方式?

1. HQL查询
• HQL(Hibernate Query Language)提供了丰富灵活的查询方式,使用HQL进行查询也是Hibernate官方推荐使用的查询方式。
• HQL在语法结构上和SQL语句十分的相同,所以可以很快的上手进行使用。使用HQL需要用到Hibernate中的Query对象,该对象专门执行HQL方式的操作。

2. QBC(Query By Criteria)查询
• Criteria对象提供了一种面向对象的方式查询数据库。Criteria对象需要使用Session对象来获得。
• 一个Criteria对象表示对一个持久化类的查询。

3. 原生SQL查询

117.hibernate 实体类可以被定义为 final 吗?

可以将Hibernate的实体类定义为final类,但这种做法并不好。因为Hibernate会使用代理模式在延迟关联的情况下提高性能,如果你把实体类定义成final类之后,因为 Java不允许对final类进行扩展,所以Hibernate就无法再使用代理了,如此一来就限制了使用可以提升性能的手段。不过,如果你的持久化类实现了一个接口而且在该接口中声明了所有定义于实体类中的所有public的方法轮到话,你就能够避免出现前面所说的不利后果。

118.在 hibernate 中使用 Integer 和 int 做映射有什么区别?

在Hibernate中,如果将OID定义为Integer类型,那么Hibernate就可以根据其值是否为null而判断一个对象是否是临时的,如果将OID定义为了int类型,还需要在hbm映射文件中设置其unsaved-value属性为0。

119.hibernate 是如何工作的?
  1. 通过Configuration config = new Configuration().configure();// 读取并解析hibernate.cfg.xml配置文件
  2. 由hibernate.cfg.xml中的< mapping resource=“com/xx/User.hbm.xml”/>//读取并解析映射信息
  3. 通过SessionFactory sf = config.buildSessionFactory();//创建SessionFactory
  4. Session session = sf.openSession();//打开Sesssion
  5. Transaction tx = session.beginTransaction();//创建并启动事务Transation
  6. persistent operate操作数据,持久化操作
  7. tx.commit();//提交事务
  8. 关闭Session
  9. 关闭SesstionFactory
120.get()和 load()的区别?

1、 查询的时机不一样
get方法任何时刻都是立即加载,只要调用get方法,就马上发起数据库查询。
load方法默认情况下是延迟加载,真正用到对象的非OID字段数据才发起查询。
2、 查询的结果不一样
get方法查询不到数据返回null。
load方法查询不到数据会抛出ObjectNotFoundException异常。

121.说一下 hibernate 的缓存机制?
  • Hibernate缓存的作用:
    Hibernate是一个持久层框架,经常访问物理数据库,为了降低应用程序对物理数据源访问的频次,从而提高应用程序的运行性能。缓存内的数据是对物理数据源中的数据的复制,应用程序在运行时从缓存读写数据,在特定的时刻或事件会同步缓存和物理数据源的数据

  • Hibernate缓存分类:

    • Hibernate缓存包括两大类:Hibernate一级缓存和Hibernate二级缓存
      • Hibernate一级缓存又称为“Session的缓存”,它是内置的,意思就是说,只要你使用hibernate就必须使用session缓存。由于Session对象的生命周期通常对应一个数据库事务或者一个应用事务,因此它的缓存是事务范围的缓存。在第一级缓存中,持久化类的每个实例都具有唯一的OID。
      • Hibernate二级缓存又称为“SessionFactory的缓存”,由于SessionFactory对象的生命周期和应用程序的整个过程对应,因此Hibernate二级缓存是进程范围或者集群范围的缓存,有可能出现并发问题,因此需要采用适当的并发访问策略,该策略为被缓存的数据提供了事务隔离级别。第二级缓存是可选的,是一个可配置的插件,在默认情况下,SessionFactory不会启用这个插件。
  • 什么样的数据适合存放到第二级缓存中?

  1. 很少被修改的数据
  2. 不是很重要的数据,允许出现偶尔并发的数据
  3. 不会被并发访问的数据
  4. 常量数据
  • 不适合存放到第二级缓存的数据?
  1. 经常被修改的数据
  2. 绝对不允许出现并发访问的数据,如财务数据,绝对不允许出现并发
  3. 与其他应用共享的数据。
122.hibernate 对象有哪些状态?
  • 临时状态(新建状态):刚用new语句创建,还没被实例化,并且不处于session的缓存中,处于临时状态的java对象被称为临时对象.
  • 持久化状态:被加入到数据库中,也被加入到session缓存中,处于持久化的java对象被称为持久化对象.
  • 游离状态:已经被持久化,但是不存在session缓存中,处于游离的java对象被称为游离对象.
  • 删除状态:不处于数据库,更不处于session缓存中.
123.在 hibernate 中 getCurrentSession 和 openSession 的区别是什么?
  1. openSession 每一次获得的是一个全新的session对象,而getCurrentSession获得的是与当前线程绑定的session对象;
  2. openSession不需要配置,而getCurrentSession需要配置
    <property name="current_session_context_class">thread</property> 
    
  3. openSession需要手动关闭,而getCurrentSession系统自动关闭
     openSession出来的session要通过:session.close(),
     而getSessionCurrent出来的session系统自动关闭,如果自己关闭会报错
    
  4. Session是线程不同步的,要保证线程安全就要使用getCurrentSession
124.hibernate 实体类必须要有无参构造函数吗?为什么?

必须要有的
原因:
Hibernate框架会调用这个默认构造方法来构造实例对象,即Class类的newInstance方法 ,这个方法就是通过调用默认构造方法来创建实例对象的 。
当查询的时候返回的实体类是一个对象实例,是Hibernate动态通过反射生成的。反射的Class.forName(“className”).newInstance()需要对应的类提供一个无参构造方法,必须有个无参的构造方法将对象创建出来,单从Hibernate的角度讲 他是通过反射创建实体对象的 所以没有默认构造方法是不行的,另外Hibernate也可以通过有参的构造方法创建对象。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值