1.为什么使用hibernate?
Hibernate封装了jdbc,使用hibernate可以减少连接数据库等繁琐重复的代码。Hibernate性能好,支持延迟检索,立即检索,一级缓存,二级缓存。
2.延迟检索(懒加载)
在使用hibernate的session.load(),query.iterate()等方法时,Hibernate返回的是一个空对象代理(除主键属性外都是null),并没有去查询数据库;而是在使用返回对象的时候才会去查询数据库,并将查询结果注入到该对象中;这种查询时机推迟到对象访问的机制称之为延迟加载,反之叫立即加载。使用懒加载要注意在session关闭前将对象初始化,不然对象会丢失,抛出异常。
如果程序加载一个持久化对象的目的是访问它的属性,则可以采用立即加载
如果程序加载一个持久化对象的目的仅仅是获得它的引用,则可以采用延迟加载。
3.cascadeType.all
关联,对主键的全部操作都会关联外键。
4.什么是ORM框架?
对象-关系映射(Object-Relational Mapping,简称ORM)。在我们的程序当中,数据是对象,在数据库中的数据也是一行一行的对象。对象-关系映射(ORM)系统一般以中间件的形式存在,主要实现程序对象到关系数据库数据的映射,当然也包括从数据库中访问对象。
5.hibernate 中如何在控制台查看打印的 sql 语句?
<property name="show_sql">true</property>
<property name="format_sql">true</property>
6.hibernate 有几种查询方式?
- HQL:session.creatQuery(HQL);
- Criteria
- Session.load/get。Load延迟加载,get立即加载
7.能否将Hibernate的实体类定义为final类?
能,但这种做法并不好。因为Hibernate会使用代理模式在延迟关联的情况下提高性能,如果你把实体类定义成final类之后,因为Java不允许对final类进行扩展,所以Hibernate就无法再使用代理了,如此一来就限制了使用可以提升性能的手段。
不过,如果你的持久化类实现了一个接口而且在该接口中声明了所有定义于实体类中的所有public的方法的话,你就能够避免出现前面所说的不利后果。
8.Hibernate的缓存机制
一级缓存是session级别的。二级缓存是sessionFactory级别的。一级缓存是内置的,不可卸载,二级缓存需要使用插件,EHCache
9.hibernate 对象有哪些状态?
Transient 瞬时 :对象刚new出来,还没设id,设了其他值。
Persistent 持久:调用了save()、saveOrUpdate(),就变成Persistent,有id
Detached 脱管 : 当session close()完之后,变成Detached。
10.hibernate 实体类必须要有无参构造函数吗?为什么?
是。Hibernate是使用反射机制创建对象的,即Class类的newInstance方法 ,这个方法就是通过调用默认构造方法来创建实例对象的 。