Hibernate简答题

简单题目 

1.持久化对象的三种状态,代表含义。   

自由状态(transient): 不曾进行持久化,未与任何Session相关联
持久化状态(persistent): 仅与一个Session相关联
游离状态(detached): 已经进行过持久化,但当前未与任何Session相关联

(1)临时状态

使用new操作符初始化的对象不是立刻就持久化的。他们的状态是瞬时的,也就是说他们没有任何跟数据库表相关联的行为,只要应用不再引用这些对象(不再被任何其他对象所引用),他们的状态将会丢失,并由垃圾回收机制回收。

临时对象具有以下特征:

  • 第一不处于Session的缓存中,也可以说,不被任何一个Session实例关联。
  • 第二在数据库中没有对应的记录。  

(2)持久化状态

持久实例是任何具有数据库标识的实例。它有持久化管理器Session统一管理,持久实例是在事务中进行操作的,他们的状态在事务结束时同数据库进行同步。

持久化对象具有几个特征:

  • 第一持久化对象总是被一个session关联。
  • 第二持久化对象与数据库中的记录对应。
  • 第三Session清理缓存的时候,会根据持久化对象的改变,更新数据库。

(3)游离状态

随着Session的关闭,曾经处于持久化状态的实例就变为游离状态。当然游离对象状态的引用依然有效,对象仍然可以被修改,如果让游离对象状态的实例重新转化为持久化状态,可以重新让该对象与某个Session关联,并且在游离状态过程中的修改也不会丢失。

2  hibernate中Session的find()方法以及Query接口的区别  

      Session类的find()方法以及Query接口都支持HQL检索方式。这两者的区别在于,前者只是执行一些简单HQL查询语句的便捷方法,它不具有动态绑定参数的功能,而且在Hibernate3.2版本中,已经淘汰了find()方法;而Query接口才是真正的HQL查询接口,它提供了以上列出的各种查询功能。

3  hibernate中session的清理和清空有什么区别?

(1)Session可以按照缓存中对象的变化来执行数据库相关的SQL语句,来同步数据库,这个过程就叫做Session清理缓存。 

(2)清空是session清除部分或全部对象或者session关闭;当调用session.evict(customer); 或者session.clear(); 或者session.close()方法时,Session的缓存被清空。 

4  请简述hibernate中Session的特点有哪些?

(1)不是线程安全的,因此在设计软件架构时,应该避免多个线程共享同一个Session实例。
(2)Session实例是轻量级的,所谓轻量级是指它的创建和销毁不需要消耗太多的资源。这意味着在程序中可以经常创建或销毁Session对象,例如为每个客户请求分配单独的Session实例,或者为每个工作单元分配单独的Session实例。
(3)在Session 中,每个数据库操作都是在一个事务(transaction)中进行的,这样就可以隔离开不同的操作(甚至包括只读操作)。

5   叙述hibernate中Session的缓存的作用

  • 第一减少访问数据库的频率。因为应用程序从缓存中读取数据比直接从数据库中读取数据速度要快的多。所以Session的缓存可以起到提高数据访问性能的作用。
  • 第二保证缓存中的相关对象与数据库中的相关记录同步,位于缓存中的对象称为持久化对象。
  • 第三当缓存中的持久化对象之间存在关联时,Session 保证不出现对象图的死锁。

          

6  请简述Hibernate与jdbc的联系

Hibernate是jdbc的轻量级封装,包括jdbc的与数据库的连接(用hibernate的配置文件实现,本质是封装了jdbc),和查询,删除等代码,都用面向对象的思想用代码联系起来,Hibernate通过hbm 配置文件(或注解)把持久化类的字段和数据库的字段关联起来比如数据库的id。

HQL语句也是面向对象的,它的查询语句不是查询数据库而是查询类的。

7  请简述Hibernate是如何实现分页的?如果不使用Hibernate提供的方法实现分页功能,则采用什么方式分页?

(1)hibernate自带的分页机制:�获得Session对象后�从Session中获得Query对象。

用Query.setFirstResult()�设置要显示的第一行数据,

  Query.setMaxResults()�设置要显示的最后一行数据。

 (2)不使用hibernate自带的分页,可采用sql语句分页�

   如�5:为每页显示的记录,2为当前页� select * top 5 from table where tabId not in (select tabId top (2-1)*5 from table);

8  Hibernate工作流程  

(1)读取并解析配置文件
(2)读取并解析映射信息,创建SessionFactory
(3)打开Sesssion
(4)创建事务Transation
(5)持久化操作
(6)提交事务
(7)关闭Session
(8)关闭SesstionFactory

9  Hibernate是如何实现延迟加载的?

Hibernate2延迟加载实现�a)实体对象 b)集合�Collection� 

Hibernate3 提供了属性的延迟加载功能 

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

10  Hibernate的三种查询方式,并简述使用方式

(1)HQL的检索方式

    Hibernate Query Language  -- Hibernate的查询语言

(2)QBC的检索方式

    Query By Criteria -- 条件查询

(3)SQL检索方式

    本地的SQL检索         

11   hibernate中get和load区别;

(1).查找不到对象时处理方式不同:get返回null,load返回异常

(2). load返回的是代理对象,等到真正用到对象的内容时才发出sql语句(懒加载模式)get不支持延迟加载。

          

12   hibernate中session.commit 和flush区别

(1)flush()方法进行清理缓存的操作,执行一系列的SQL语句,但不会提交事务;commit()方法会先调用flush()方法,然后提交事务. 提交事务意味着对数据库所做的更新会永久保持下来   所谓清理,是指Hibernate 按照持久化象的状态来同步更新数据库   

  (2)Flush()后只是将Hibernate缓存中的数据提交到数据库,如果这时数据库处在一个事物当中,则数据库将这些SQL语句缓存起来,当Hibernate进行commit时,会告诉数据库,你可以真正提交了,这时数据才会永久保存下来,也就是被持久化了.    

(3)commit针对事物的,flush针对缓存的, 数据同步到数据库中后只要没有commit还是可以rollback的。 

13   写出5个hibernate主键生成 策略

1) assigned
主键由外部程序负责生成,无需Hibernate参与。
2) hilo
通过hi/lo 算法实现的主键生成机制,需要额外的数据库表保存主键生成历史状态。
3) seqhilo
与hilo 类似,通过hi/lo 算法实现的主键生成机制,只是主键历史状态保存在Sequence中,适用于支持Sequence的数据库,如Oracle。
4) increment
主键按数值顺序递增。此方式的实现机制为在当前应用实例中维持一个变量,以保存着当前的最大值,之后每次需要生成主键的时候将此值加1作为主键。这种方式可能产生的问题是:如果当前有多个实例访问同一个数据库,那么由于各个实例各自维护主键状态,不同实例可能生成同样的主键,从而造成主键重复异常。因此,如果同一数据库有多个实例访问,此方式必须避免使用。
5) identity
采用数据库提供的主键生成机制。如DB2、SQL Server、MySQL中的主键生成机制。
6) sequence
采用数据库提供的sequence 机制生成主键。如Oralce中的Sequence。
7) native
由Hibernate根据底层数据库自行判断采用identity、hilo、sequence其中一种作为主键生成方式。
8) uuid.hex
由Hibernate基于128 位唯一值产生算法生成16 进制数值(编码后以长度32 的字符串表示)作为主键。
9) uuid.string
与uuid.hex 类似,只是生成的主键未进行编码(长度16)。在某些数据库中可能出现问题(如PostgreSQL)。
10) foreign
使用外部表的字段作为主键。一般而言,利用uuid.hex方式生成主键将提供最好的性能和数据库平台适应性。    

14   hibernate中update和saveOrUpdate的区别  

update()和saveOrUpdate()是用来对跨Session的PO进行状态管理的。

update()方法操作的对象必须是持久化了的对象。也就是说�如果此对象在数据库中不存在的话�就不能使用update()方法。

saveOrUpdate()方法操作的对象既可以使持久化了的�也可以使没有持久化的对象。如果是持久化了的对象调用saveOrUpdate()则会 更新数据库中的对象�如果是未持久化的对象使用此方法,则save到数据库中。

15   如何在控制台看到hibernate生成并执行的sql 

在定义数据库和数据库属性的文件applicationConfig.xml里面,把hibernate.show_sql 设置为true,这样生成的SQL就会在控制台出现了
注意:这样做会加重系统的负担,不利于性能调优

16   hibernate中Detached Object有什么好处

Detached Object(游离对象)可以传递到任何层直到表现层而不是用任何DTO(Data Transfer Objects). 然后你还可以重新把游离对象赋给另外一个Session.      

17   什么是SessionFactory,它是线程安全么

SessionFactory接口负责初始化Hibernate。它充当数据存储源的代理,并负责创建Session对象。这里用到了工厂模式。需要注意的是SessionFactory并不是轻量级的,因为一般情况下,一个项目通常只需要一个SessionFactory就够,当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。是线程安全的       

18   Hibernate的五个核心接口并简述其作用

  • Configuration接口:配置Hibernate,根启动Hibernate,创建SessionFactory对象。
  • SessionFactory接口:初始化Hibernate,充当数据存储源的代理,创建Session对象。
  • Session接口:负责保存、更新、删除、加载和查询对象。
  • Transaction接口:管理事务。
  • Query和Criteria接口:执行数据库查询。    

19   hibernate的Session是什么?两个线程能共享同一个session吗  

hibernate中的session是一级缓存,可以理解为进程级的缓存。在进程运行期间一直存在。Hibernat对数据库的操作是通过Session来实现的,这里的session不同于页面间传递参数的session,而是类似于JDBC中的Connection。Session是Hibernate运作的中心,对象的生命周期、事务的管理、数据库的存取都与session息息相关。
 

 不能共享,因为session是线程不安全的

     

20   Hibernate 的检索方式有哪些 ?

(1)导航对象图检索方式。(根据已经加载的对象,导航到其他对象。)

(2)OID检索方式。(按照对象的OID来检索对象。)

(3)HQL检索方式。(使用面向对象的HQL查询语言。)

(4)QBC检索方式。(使用QBC(Qurey By Criteria) API来检索对象。)

(5)本地SQL检索方式。(使用本地数据库的SQL查询语句。)

      

原文地址:https://www.cnblogs.com/mlan/p/7927125.html