面试准备java小白的进阶之路

hibernate 面试题集锦

2018-03-24  本文已影响1626人  一只很懒很懒的虫

      hibernate 的缓存机制:

分为一级缓存和二级缓存。一级缓存是session中的缓存,在执行一个查询操作的时候,先会在session的缓存中查找对应的信息,然后向数据库发出一条sql语句进行查询,同时向session缓存中添加这个记录。在执行save时向数据库保存,同时在缓存中保存一份。一级缓存是系统自带的,随着session消毁而消毁。同时缓存区还有一个快照区,数据的副本,程序员不能对其修改。

二级缓存是在sessionfactory中的。因为涉及到多个session,所以被设计成线程安全的。使用二级缓存做完在配置文件中配置。不是系统自带的。

查询缓存指的是某一次的查询记录的缓存。重复的sql语句则采用查询缓存的方式。

      hibernate的三种状态:

瞬时态,即没有和session有任何关联,只是被new出来的对象,在jvm中获得一片内存空间,数据库中没有对应记录的。

持久态,当执行save,update等操作与session发生关联的。保存在数据库以及一级缓存中,拥有持久化得标识。

脱管态,对象和session无关了,此时对象脱离了缓存管理,session关闭。

  hibernate的一些配置关键字:

  inverse:指的是由哪一方来维护关联关系。中文意思是反转。默认为false就是维护关系的权利在自己手上不反转。直接由该方维护。而这当中的维护两表之间的关系又要引出另一个问题那就是cascade这个关键字。

cascade指的是:  级联操作,就是一个表有所改变的时候涉及到另一个表的同时改变。可以选择的范围是:none,不做级联。(默认情况下都不做) all所有的操作都做级联。sava-update的时候做级联操作。delete做级联操作。

举例说明两者的使用出现的情况:

      当一对多的关系,比如小组和组员,现在在小组的配置中设置inverse为false,cascade为all。此时保存小组信息时,会因为cascade的关系主动保存组员的信息,此时的小组id是null值,但因为inverse的关系,会再发出update语句将两者的关系维护起来。把小组id放入组员的记录中去。

    所以简单的理解就是inverse是维护外键的值什么时候被插入的问题(O_O)?。

fetch:主要解决的是懒加载问题(O_O)?

什么是懒加载:就是当需要用到的时候才会真正的发生sql语句

fetch的配置有select和join,subselect

select的查询是指先查询要查询出的列表再根据id查询出结果。这样就会导致n+1的问题。。懒加载有效,所以如果设置懒加载的话先查一方的数据,在需要用到的时候去发出n条sql语句去查询多方的数据。

而使用join查询就是采用连接的方式,不会形成多次查询。只会发出一条连接语句。此时如果设置lazy将会失效。但实际上用hql查询的时候一定要再语句中使用join配置文件中配置是无效的。它会当做select处理。

subselect是指

hibernate 面试题集锦

batch-size:select是一次抓取一条数据,而subselect是抓取所有的记录。而batch-size是一个折中点。它可以设置抓取的记录的大小。类似于批量的操作。

上一篇 下一篇

猜你喜欢

热点阅读