关于Hibernate的面试题

一、hibernate的原理

1.通过Configuration().configure();读取并解析hibernate.cfg.xml配置文件

2.由hibernate.cfg.xml中的<mappingresource="com/xx/User.hbm.xml"/>读取并解析映射信息

3.通过config.buildSessionFactory();//创建SessionFactory

4.sessionFactory.openSession();//打开Sesssion

5.session.beginTransaction();//创建事务Transation

6.persistent operate持久化操作 //一般指Save这个方法

7.session.getTransaction().commit();// 提交事务

8.关闭Session

9.关闭SesstionFactory

https://www.cnblogs.com/FoxLegend/p/6381579.html

二、hibernate的优点

优点:

1、程序更加面向对象
2、提高了生产率;
3、方便移植(修改配置文件);
4、无侵入性。
缺点:
1、效率比JDBC略差;
2、不适合批量操作。

https://www.cnblogs.com/tianzibobo/articles/3154909.html

三、什么是Hibernate延迟加载

延迟加载是指当应用程序想要从数据库获取对象时(在没有设置lazy属性值为false),Hibernate只是从数据库获取符合条件的对象的OId从而生成代理对象,并没有加载出对象

访问该对象的属性时才会加载出相应的值。简答来说就是尽可能的减少查询的数据量。

https://www.cnblogs.com/wangzheand/p/5781348.html

四、Hibernate中类之间的关联关系有几种

一对一

一对多(多对一)

多对多

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

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

https://blog.csdn.net/qq1137623160/article/details/71194677

六、Hibernate的查询方式

本地SQL查询、Criteria、Hql

https://blog.csdn.net/kingmax54212008/article/details/61196046

https://blog.csdn.net/Cecilia620/article/details/72828398

七、如何优化Hibernate

① 制定合理的缓存策略(二级缓存、查询缓存)。
② 采用合理的Session管理机制。
③ 尽量使用延迟加载特性。
④ 设定合理的批处理参数。
⑤ 如果可以,选用UUID作为主键生成器。
⑥ 如果可以,选用基于版本号的乐观锁替代悲观锁。
⑦ 在开发过程中, 开启hibernate.show_sql选项查看生成的SQL,从而了解底层的状况;开发完成后关闭此选项。                       ⑧考虑数据库本身的优化,合理的索引、恰当的数据分区策略等都会对持久层的性能带来可观的提升,但这些需要专业的DBA(数据库管理员)提供支持。

https://blog.csdn.net/qq_29924795/article/details/72810863

八、Hibernate中的一级缓存和二级缓存

一级缓存:

每个 Session 对象创建出来,就会分配一块缓存空间,可以存储 session 对象访问的对象信息。 session 关闭后会自动清除缓存,手动清除可以用session.clear() , session.evict(obj) 。 Session 一级缓存是独享。
load/get/save/update/saveorupdate 方法处理的对象都会放入缓存中。

二级缓存:

二级缓存是SessionFactory 对象缓存,可以被创建出的多个 Session 对象共享。

下面是一张图片体现一级缓存和二级缓存的关系:

从这个我们就看出了二级缓存包含了一级缓存。

二级缓存默认是关闭的,如果要使用需要手动开启。

https://www.cnblogs.com/HDK2016/p/7351727.html

http://www.cnblogs.com/xiaoluo501395377/p/3377604.html

https://blog.csdn.net/u012518860/article/details/78256874

九、Hibernate关于对象的三种状态

瞬态(Transient),也叫临时态。处于这种状态的对象具备的特征如下:

  1.          不在Session的缓存中,不与任何的Session实例相关联。
  2.         在数据库中没有与之相对应的记录。

持久态(Persistent),处于这种状态的对象具备的特征如下:

  1.          在Session的缓存中,与Session实例相关联。
  2.         在数据库中存在与之相对应的记录。

脱管态(Detached),也叫游离态。处于这种状态的对象具备的特征如下:

  1.          不在Session的缓存中,不与任何的Session实例相关联。
  2.         在数据库中存在与之相对应的记录。(前提条件是没有其他Session实例删除该条记录)。

十、Hibernate二级缓存中存放数据的原则?

1.什么样的数据适合存放到第二级缓存中?

1) 很少被后台修改的数据

2) 不是很重要的数据,允许出现偶尔并发的数据

3) 访问量大,不会被并发访问的数据,如个人资料

4) 参考数据,指的是供应用参考的常量数据,它的实例数目有限,它的实例会被许多其他类的实例引用,实例极少或者从来不会被修改。

2.不适合存放到第二级缓存的数据

1) 经常被后台修改的数据 ,这里指的是前台后台使用了不同的orm实现

2) 财务数据,绝对不允许出现并发

3) 与其他应用共享的数据。

4)访问量不大的数据

对于以上我的理解是:

1.如一个网站,需要经常看到或者修改个人资料。这类数据,一般修改是由用户实现,因此可以放入缓存。这样,查看可以从缓存中拿取,减轻服务器负担,也不用担心拿取的数据与数据库的不同(因为后台管理不会平白去修改这些数据)。所以一般只由用户修改的数据,可以推荐使用缓存,且过期时间还可以设置长一点。

2.而如关于公司的一些介绍,这些数据一般交由后台进行修改管理且访问量不大,就没必要使用缓存。

3.如果前台不能修改的一些数据,使用缓存时,可设置<cache usage="read-only"/>,否则可设置<cache usage="read-write"/>。

https://blog.csdn.net/localhost01/article/details/78172806?utm_source=copy

十一、Hibernate查找对象如何应用缓存

当Hibernate根据ID访问数据对象的时候,首先从Session一级缓存中查;

查不到,如果配置了二级缓存,那么从二级缓存中查;

如果都查不到,再查询数据库,把结果按照ID放入到缓存,删除、更新、增加数据的时候,同时更新缓存。

十二、Hibernate拒绝连接、服务器崩溃的原因?

1. db没有打开
2. 网络连接可能出了问题
3. 连接配置错了
4. 驱动的driver,url是否都写对了
5. LIB下加入相应驱动,数据连接代码是否有误
6. 数据库配置可能有问题
7. 当前联接太多了,服务器都有访问人数限制的
8. 服务器的相应端口没有开,即它不提供相应的服务

十三、Hibernate的核心类

https://blog.csdn.net/xlgen157387/article/details/39777827

Hibernate的核心类和接口一共有6个,分别为:Session、SessionFactory、Transaction、Query、Criteria和Configuration。这6个核心类和接口在任何开发中都会用到。

Configuration

用于加载hibernate配置

Session

Session接口负责执行被持久化对象的CRUD操作(CRUD的任务是完成与数据库的交流,包含了很多常见的SQL语句)。

Session常用的方法:

         save  保存对象

         update 修改操作

         delete删除

         get/load 根据id进行查询

         savenOrUpdate 执行save或update操作

         createQuery()获取一个Query对象

         CreateSQLQUery()获取一个可以操作sql的SQLQuery对象

         createCriteria() 获取一个Criteria它可以完成条件查询

SessionFactory

SessionFactory接口负责初始化Hibernate。它充当数据存储源的代理,并负责创建Session对象。

SessionFactory特点:

   1.线程安全,一个实例多个线程共享。

  2.不能随意创建和销毁,因为是重量级的。一个数据库只需创建一个SessionFactory实例,初始化时创建。如果同时访问多个数据库,需要对应每个数据库创建对应的实例。否则线程共享数据时,发生数据混乱。

Transaction

Transaction接口主要用于管理事务,它是hibernate的事务接口,对底层的事务进行了封装。使用它可以进行事务操作。

commit 事务提交

rollback 事务回滚

Query

Query接口让你方便地对数据库及持久对象进行查询,它可以有两种表达方式:HQL语言或本地数据库的SQL语句。Query经常被用来绑定查询参数、限制查询记录数量,并最终执行查询操作。

通过Query主要完成查询操作.

我们通过Query可以执行hql语句.

Query query=Session.createQuery(hql);

下面这个可以执行sql语句

SQLQUery sqlQuery=Session.createSQLQuery(sql);

Criteria

Criteria接口与Query接口非常类似,允许创建并执行面向对象的标准化查询。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值