• Java面试-Hibernate总结


    1  Hibernate的检索方式

    Ø  导航对象图检索(依据已经载入的对象。导航到其它对象。

    Ø  OID检索(依照对象的OID来检索对象。

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

    Ø  QBC检索(使用QBC(Qurey By Criteria)API来检索对象。

    QBC/QBE离线/在线

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

    http://blog.csdn.net/lenotang/article/details/2596680

    2  Hibernate中对象的状态

    Ø  暂时状态(transient):刚刚用new语句创建,还没有被持久化,不处于Session的缓存中。

    处于暂时状态的Java对象被称为暂时对象。

    Ø  持久化状态(persistent):已经被持久化。增加到Session的缓存中。处于持久化状态的Java对象被称为持久化对象。

    Ø  游离状态(detached):已经被持久化,但不再处于Session的缓存中。处于游离状态的Java对象被称为游离对象。

    http://blog.csdn.net/communicate_/article/details/8452786

    3  Hibernate的3种检索策略是什么。分别适用于哪种场合

    Ø  马上检索

    长处:相应用程序全然透明。

    缺点:select语句数目多。

    适用:类级别。

    Ø  延迟检索

    长处:由应用程序决定载入哪些对象,能够避免运行多余的select语句以及避免载入不须要訪问的对象。节省内存空间,提高检索效率。

    缺点:应用程序假设要訪问游离态的代理类实例。必须保证它在持久化时已经被初始化。

    适用:一对多或多对多关联。应用程序不须要马上訪问或者根本不会訪问的对象。

    Ø  迫切左外连接检索

    长处:相应用程序全然透明。无论对象处于持久化状态还是游离状态。应用程序都能够方便的从一个对象导航到还有一个与它相关联的对象。使用了外连接,select语句数目少。

    缺点:可能会载入程序不许要訪问的对象。复杂的数据库表连接形象检索性能。

    适用:一对一或多对一关联。

    应用程序须要马上訪问的对象。数据库系统具有良好的表连接性能。

    http://blog.csdn.net/adoocoke/article/details/8291966

    4  ORM解决的不匹配问题(域模型与关系模型之间存在的不匹配)

    Ø  域模型是面向对象的,关系模型是面向关系的。

    Ø  域模型中有继承关系。关系模型中不能直接表示继承关系。

    Ø  域模型中有多对多关联关系,关系模型中通过连接表来表示多对多关联关系。

    Ø  域模型中有双向关联关系。关系模型中仅仅有单向參照关系,并且总是many參照one方。

    Ø  域模型提倡精粒度模型,关系模型提倡粗粒度模型。

    5  Hibernate映射继承关系的3种方式

    Ø  整个的继承体系就用一张表(tableper hierarchy)

    Ø  每一个子类一张表。存放子类所特有的属性(tableper subclass)

    Ø  每一个详细类一张表(union-subclass)。保存是子类完整信息(table per concrete )

    http://blog.csdn.net/yanwushu/article/details/7680765

    6  Session的find()方法以及Query接口的差别

    Session类的find()方法以及Query接口都支持HQL检索方式。

    这两者的差别在于,前者仅仅是运行一些简单HQL查询语句的便捷方法,它不具有动态绑定參数的功能,并且在Hibernate3.x版本号中,已经淘汰了find()方法;而Query接口才是真正的HQL查询接口。它提供了以上列出的各种查询功能。

    7  Hibernate关联关系配置

    Ø  一对一

    Ø  一对多

    Ø  多对多

    http://blog.csdn.net/lrain0813/article/details/5756015

    8  简述Session的特点

    Ø  不是线程安全的,因此在设计软件架构时。应该避免多个线程共享同一个Session实例。

    Ø  Session实例是轻量级的,所谓轻量级是指它的创建和销毁不须要消耗太多的资源。这意味着在程序中能够常常创建或销毁Session对象,比如为每一个客户请求分配单独的Session实例,或者为每一个工作单元分配单独的Session实例。

    Ø  在Session中。每一个数据库操作都是在一个事务(transaction)中进行的,这样就能够隔离开不同的操作(甚至包含仅仅读操作)。

    9  Hibernate中採用XML文件来配置对象-关系映射的长处

    Hibernate既不会渗透到上层域模型中,也不会渗透到下层数据模型中。软件开发者能够独立设计域模型,不必强迫遵守不论什么规范。

    数据库设计人员能够独立设计数据模型,不必强迫遵守不论什么规范。

    对象-关系映射不依赖于不论什么程序代码,假设须要改动对象-关系映射,仅仅需改动XML文件,不须要改动不论什么程序,提高了软件的灵活性,而且使维护更加方便。

    http://blog.csdn.net/it_man/article/details/1477317

    10  Session的缓存的作用

    Ø  降低訪问数据库的频率。应用程序从内存中读取持久化对象的速度显然比到数据库中查询数据的速度快多了,因此Session的缓存能够提高数据訪问的性能。

    Ø  保证缓存中的对象与数据库中的相关记录保持同步。

    当缓存中持久化对象的状态发生了变换,Session并不会马上运行相关的SQL语句,这使得Session可以把几条相关的SQL语句合并为一条SQL语句。以便降低訪问数据库的次数,从而提高应用程序的性能。

    11  多事务并发执行时的问题

    Ø  第一类丢失更新

    Ø  脏读

    Ø  虚读/幻读

    Ø  不可反复读

    Ø  第二类丢失更新

    http://www.iteye.com/topic/791346

    12  session的清理和清空的差别

    Ø  session清理缓存是指依照缓存中对象的状态的变化来同步更新数据库。Hibernate包括了三类sessionFlush模式)

    Ø  清空是session清除部分或所有对象或者session关闭;

    http://blog.sina.com.cn/s/blog_62a151be0100nf28.html

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

    Ø  原理

    1.读取并解析配置文件

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

    3.打开Sesssion

    4.创建事务Transation

    5.持久化操作

    6.提交事务

    7.关闭Session

    8.关闭SesstionFactory

    Ø  为什么要用

    1.对JDBC訪问数据库的代码做了封装。大大简化了数据訪问层繁琐的反复性代码。

    2.Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他非常大程度的简化DAO层的编码工作

    3.hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。

    4.hibernate的性能非常好。由于它是个轻量级框架。映射的灵活性非常出色。它支持各种关系数据库。从一对一到多对多的各种复杂关系。

    http://www.cnblogs.com/shanmu/p/3598477.html

    14  Hibernate延迟载入

    1.Hibernate2延迟载入实现:a)实体对象 b) 集合类型(Collection)

    2.Hibernate3 提供了属性的延迟载入功能

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

    http://blog.163.com/xi_zh_qi/blog/static/8501594200812695053939/

    15  Hibernate的缓存机制

    1.一级缓存又叫内部缓存存在Hibernate,属于应用事务级缓存

    2.二级缓存

    a) 应用及缓存

    b) 分布式缓存

    条件:数据不会被第三方改动、数据大小在可接受范围、数据更新频率低、同一数据被系统频繁使用、非重要数据。

    c) 第三方缓存的实现

    http://www.cnblogs.com/wean/archive/2012/05/16/2502724.html

    16  优化Hibernate

    1.使用双向一对多关联,不使用单向一对多

    2.灵活使用单向一对多关联

    3.不用一对一。用多对一代替

    4.配置对象缓存,不使用集合缓存

    5.一对多集合使用Bag,多对多集合使用Set

    6.继承类使用显式多态

    7.表字段要少。表关联不要怕多,有二级缓存撑腰

    http://blog.csdn.net/sprita1/article/details/9289971


  • 相关阅读:
    Python中的返回函数与闭包
    Python的高阶函数小结
    Python的生成器Generator小结
    Vim插件YCM的安装
    用Vundle管理Vim插件
    声卡(Sound Card)基本概念
    Linux中Source的用法
    js 的执行过程
    mongoose@4.5.2的eachAsync bug
    [mongodb] MMAP 和wiredTiger 的比较
  • 原文地址:https://www.cnblogs.com/jzssuanfa/p/7259449.html
Copyright © 2020-2023  润新知