Hibernate常见面试题
 

Hibernate工作原理及为什么要用?

Hibernate工作原理及为什么要用?

  1. 读取并解析配置文件

  2. 读取并解析映射信息,创建SessionFactory

  3. 打开Sesssion

  4. 创建事务Transation

  5. 持久化操作

  6. 提交事务

  7. 关闭Session

  8. 关闭SesstionFactory

Hibernate面试题大全_hibernate

使用Hibernate框架就不用我们写很多繁琐的SQL语句。Hibernate实现了ORM,能够将对象映射成数据库表,从而简化我们的开发!

Hibernate是如何延迟加载(懒加载)?

Hibernate是如何延迟加载(懒加载)?

通过设置属性lazy进行设置是否需要懒加载

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

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

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

它们通过配置文件中的many-to-one、one-to-many、many-to-many来实现类之间的关联关系的。

hibernate的三种状态之间如何转换

hibernate的三种状态之间如何转换

Hibernate中对象的状态:

临时/瞬时状态

当我们直接new出来的对象就是临时/瞬时状态的..

Hibernate面试题大全_hibernate_02 这里写图片描述

持久化状态

当保存在数据库中的对象就是持久化状态了

Hibernate面试题大全_hibernate_03 这里写图片描述

我们来测试一下:当对对象属性进行更改的时候,会反映到数据库中!

        session.save(idCard);        idCard.setIdCardName("我是测试持久化对象");"我是测试持久化对象");
Hibernate面试题大全_hibernate_04 这里写图片描述

游离状态

当Session关闭了以后,持久化的对象就变成了游离状态了…

Hibernate面试题大全_hibernate_05 这里写图片描述

有了上面的基础,我们就很容易说出它们之间的转换了

比较hibernate的三种检索策略优缺点

比较hibernate的三种检索策略优缺点

立即检索:

延迟检索:

迫切左外连接检索:

hibernate都支持哪些缓存策略

hibernate都支持哪些缓存策略

usage的属性有4种:

hibernate里面的sorted collection 和ordered collection有什么区别

hibernate里面的sorted collection 和ordered collection有什么区别

sorted collection

ordered collection

对于比较大的数据集,为了避免在内存中对它们进行排序而出现 Java中的OutOfMemoryError,最好使用ordered collection。

说下Hibernate的缓存机制

说下Hibernate的缓存机制

一级缓存:

二级缓存:

Hibernate面试题大全_hibernate_06 这里写图片描述

Hibernate的查询方式有几种

Hibernate的查询方式有几种

如何优化Hibernate?

如何优化Hibernate?

详情可参考资料:

谈谈Hibernate中inverse的作用

谈谈Hibernate中inverse的作用

inverse属性默认是false,就是说关系的两端都来维护关系。

如果表之间的关联关系是“一对多”的话,那么inverse只能在“一”的一方来配置!

详情可参考:

JDBC hibernate 和 ibatis 的区别

JDBC hibernate 和 ibatis 的区别

jdbc:手动

ibatis的特点:半自动化

hibernate:全自动

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

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

  1. 建索引

  2. 减少表之间的关联

  3. 优化sql,尽量让sql很快定位数据,不要让sql做全表查询,应该走索引,把数据量大的表排在前面

  4. 简化查询字段,没用的字段不要,已经对返回结果的控制,尽量返回少量数据

详情可参考:

什么是SessionFactory,她是线程安全么

什么是SessionFactory,她是线程安全么

SessionFactory 是Hibrenate单例数据存储和线程安全的,以至于可以多线程同时访问。一个SessionFactory 在启动的时候只能建立一次。SessionFactory应该包装各种单例以至于它能很简单的在一个应用代码中储存.

get和load区别

get和load区别

Hibernate面试题大全_hibernate_07 这里写图片描述 Hibernate面试题大全_hibernate_08 这里写图片描述

merge的含义:

merge的含义:

详情可参考:

persist和save的区别

persist和save的区别

参考资料:

主键生成 策略有哪些

主键生成 策略有哪些

主键的自动生成策略

指定主键生成策略为手动指定主键的值

指定主键生成策略为UUID生成的值

foreign(外键的方式)

简述hibernate中getCurrentSession和openSession区别

简述hibernate中getCurrentSession和openSession区别

Hibernate中的命名SQL查询指的是什么?

Hibernate中的命名SQL查询指的是什么?

为什么在Hibernate的实体类中要提供一个无参数的构造器这一点非常重要?

为什么在Hibernate的实体类中要提供一个无参数的构造器这一点非常重要?

每个Hibernate实体类必须包含一个 无参数的构造器, 这是因为Hibernate框架要使用Reflection API,通过调用Class.newInstance()来创建这些实体类的实例。如果在实体类中找不到无参数的构造器,这个方法就会抛出一个InstantiationException异常。

可不可以将Hibernate的实体类定义为final类?

可不可以将Hibernate的实体类定义为final类?

可以将Hibernate的实体类定义为final类,但这种做法并不好。因为Hibernate会使用代理模式在延迟关联的情况下提高性能,如果你把实体类定义成final类之后,因为 Java不允许对final类进行扩展,所以Hibernate就无法再使用代理了,如此一来就限制了使用可以提升性能的手段。

最后

参考资料:


如果文章有错的地方欢迎指正,大家互相交流。习惯在微信看技术文章,想要获取更多的Java资源的同学,可以关注微信公众号:Java3y