Java 最常见的 208 道面试题(113-124)------Hibernate

113.为什么要使用 hibernate?

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

114.什么是 ORM 框架?

对象 - 关系映射,面向对象的开发方法是当今主流开发方法,关系数据库是企业级应用环境中永久存放数据额主流数据存储系统。对象和关系数据是业务实体的两种表现形式,业务实体在内存中表现为对象,在数据库中表现为关系数据。内存中的对象之间存在关系和继承关系,在数据库中,关系数据无法直接表达多对多关联和继承关系。因此,对象 - 关系映射(ORM)系统一般以中间件的形式存在,主要实现程序对象到关系数据库数据的映射

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

https://mp.csdn.net/console/editor/html/104742299

116.hibernate 有几种查询方式?

       hql查询
       sql查询
       条件查询

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


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

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

如果将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/**/User.hbm.xml"/> 读取并解析映射信息
       3.通过SessionFactory sf = config.buildSessionFactory(); //创建SessionFactory
       4.Session session = sf.openSession(); //打开session
       5.Transaction tx = session.beginTransaction();  //创建并启动实务Transation
       6.persistent operate  //操作数据,持久化操作
       7.tx.commit() ; //提交事务
       8.关闭session
       9.关闭SessionFactory

120.get()和 load()的区别?

       load()没有使用对象的其它属性的时候,没有SQL       延迟加载
       get()没有使用对象的其它属性的时候, 也生成了SQL 立即加载

121.说一下 hibernate 的缓存机制?

Hibernate中的缓存为一级缓存和二级缓存
       一级缓存就是Session级别的缓存,在事务范围内有效是,内置的不能被卸载。二级缓存是SessionFactory级别的缓存,从应用启动到应用结束有效。是可选的,默认没有二级缓存,需要手动开启,保存数据库后,缓存在内存中保存一份,如果更新了数据库就要同步更新。
       适合存放到二级缓存中的数据:
             很少被修改的数据  帖子最后的回复时间
             经常被查询的数据   电商的地点
             不是很重要的数据, 允许偶尔出现并发的数据
             不会被并发访问的数据
             常量数据
          hibernate的二级缓存默认是不支持分布式缓存的。使用memache,redis等中央缓存来代替二级缓存

122.hibernate 对象有哪些状态?

   hibernate里对象有三种状态:
           1.Transient(瞬时):对象刚new出来,还没设id,设了其他值
           2.Persistent(持久):调用了save(),saveOrUpdate(),就变成Persistent,由 id
           3.Detached(脱管):当session close()完之后, 变成Detached

123.在 hibernate 中 getCurrentSession 和 openSession 的区别是什么?

openSession 从字面上可以看得出来,是打开一个新的session对象,而且每次使用都是打开一个新的session,假如连续使用多次,则获得的session不是同一个对象,并且使用完需要调用close方法关闭session。

      getCurrentSession ,从字面上可以看得出来,是获取当前上下文一个session对象,当第一次使用此方法时,会自动产生一个session对象,并且连续使用多次时,得到的session都是同一个对象,这就是与openSession的区别之一,简单而言,getCurrentSession 就是:如果有已经使用的,用旧的,如果没有,建新的。

       注意:在实际开发中,往往使用getCurrentSession多,因为一般是处理同一个事务(即是使用一个数据库的情况),所以在一般情况下比较少使用openSession或者说openSession是比较老旧的一套接口了。

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

必须,因为hibernate框架会调用这个默认构造方法来构造实例对象,即Class类的newInstance方法,这个方法就是通过调用默认构造方法来创建实例对象的。

        另外再提醒一点,如果你没有提供任何构造方法,虚拟机会自动提供默认构造方法(无参构造器),但是如果你提供了其他有参数的构造方法的话,虚拟机就不再为你提供默认构造方法,这时必须手动把无参构造器写在代码里,否则new Xxxx()是会报错的,所以默认的构造方法不是必须的,只在有多个构造方法时才是必须的,这里“必须”指的是“必须手动写出来”。

发布了22 篇原创文章 · 获赞 1 · 访问量 1620

猜你喜欢

转载自blog.csdn.net/qq_42029989/article/details/104900637