版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1.Hibernate工作原理及为什么要用?原理: 1.读取并解析配置文件 2.读取并解析映射信息,创建SessionFactory 3.打开Session 4.创建事务Transation 5.持久化操作 6.提交事务 7.关闭Session 8.关闭SesstionFactory 为什么要用: 1). 对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。 2). Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作 3). hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。 4). h
2、ibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。 2Hibernate是如何延迟加载? 1). Hibernate2延迟加载实现:a)实体对象 b)集合(Collection) 2). Hibernate3 提供了属性的延迟加载功能 当Hibernate在查询数据的时候,数据并没有存在与内存中,当程序真正对数据的操作时,对象才存在与内存中,就实现了延迟加载,他节省了服务器的内存开销,从而提高了服务器的性能。 3Hibernate中怎样实现类之间的关系?(如:一对多、多对多的关系) 类与类之间的关系主要体现在表与表之间
3、的关系进行操作,它们都是对对象进行操作,我们程序中把所有的表与类都映射在一起,它们通过配置文件中的many-to-one、one-to-many、many-to-many 4.Hibernate中的update()和saveOrUpdate()的区别. 摘自hibernate说明文档: saveOrUpdate()做下面的事: 如果对象已经在本session中持久化了,不做任何事 如果另一个与本session关联的对象拥有相同的持久化标识(identifier),抛出一个异常 如果对象没有持久化标识(identifier)属性,对其调用save() 如果对象的持久标识(identifier)表
4、明其是一个新实例化的对象,对其调用save() 如果对象是附带版本信息的(通过 或 ) 并且版本属性的值表明其是一个新实例化的对象,save()它。 否则update() 这个对象5.Hibernate有哪几种查询数据的方式 hql查询,sql查询,条件查询答:导航对象图检索 OID检索 HQL检索 QBC检索 本地SQL检索6.load()和get()的区别是什么?答:1)他们都试图从数据库加载一个实体对象时,Session先判断该对象是否位于缓存之中,如果存在就直接返回位于Session缓存中的持久化对象,如果修改了持久化对象的属性,那么当Session清理缓存时,会根据持久化对象的属性变
5、化来同步更新数据库。2)区别: 当数据库中不存在与OID对应的记录时,load()方法会抛出ObjectNotFoundException异常,而get()方法会返回null。3)两者采用的延迟策略不同: 默认情况下,load()方法采用延迟检索策略()(Hibernate不会执行select语句,金返回实体类的代理类实例,占用内存很少);而get()采用立即检索策略(Hibernate会立即执行select语句)4)使用场合: 如果加载一个对象的目的是为了访问他的各个属性,可以get(); 如果加载一个对象的目的是为了删除它,或者建立与别的对象的关联关系,可以使用load();7.谈谈hib
6、ernate的延迟加载和openSessionInView 延迟加载要在session范围内,用到的时候再加载;opensessioninview是在web层写了一个filter来打开和关闭session,这样就表示在一次request过程中session一直开着,保证了延迟加载在session中的这个前提。8.Hibernate工作原理及为什么要用? 原理: 1).读取并解析配置文件 2).读取并解析映射信息,创建SessionFactory 3).打开Sesssion 4).创建事务Transation 5).持久化操作 6).提交事务 7).关闭Session 8).关闭Sesstion
7、Factory为什么要用: 1). 对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。2). Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作3). hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。4). hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。9Hibernate是如何延迟加载? 1. Hibernate2延迟加载实现:a)实体对象 b)集合(Collection)2. Hibernate3
8、提供了属性的延迟加载功能当Hibernate在查询数据的时候,数据并没有存在与内存中,当程序真正对数据的操作时,对象才存在与内存中,就实现了延迟加载,他节省了服务器的内存开销,从而提高了服务器的性能。10.Hibernate中怎样实现类之间的关系?(如:一对多、多对多的关系)类与类之间的关系主要体现在表与表之间的关系进行操作,它们都是对对象进行操作,我们程序中把所有的表与类都映射在一起,它们通过配置文件中的many-to-one、one-to-many、many-to-many、11.Hibernate的查询方式 Sql、Criteria,object comptosition Hql: 1)
9、、 属性查询 2)、 参数查询、命名参数查询 3)、 关联查询 4)、 分页查询 5)、 统计函数12.如何优化Hibernate? 1).使用双向一对多关联,不使用单向一对多 2).灵活使用单向一对多关联 3).不用一对一,用多对一取代 4).配置对象缓存,不使用集合缓存 5).一对多集合使用Bag,多对多集合使用Set 6). 继承类使用显式多态 7). 表字段要少,表关联不要怕多,有二级缓存撑腰8).制定合理的缓存策略采用合理的session管理机制尽量使用延迟加载many大文本、大文件设定合理的批处理参数(batch-size)如有可能,选用uuid作为主键生成器如有可能,选用基于ve
10、rsion的乐观锁替代悲观锁开发过程中,打开hibernate的SQl日志输出(hibernate.show_sql=true),通过观察hibernate生成的sql语句进一步了解其实现原理,从而指事实上更好的实现策略。13.Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序实用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,
11、完成数据持久化的重任。大多数开发机构经常采取创建各自独立的数据持久层。一旦底层的数据结构发生改变,那么修改应用的其余部分使之适应这种改变的代价将是十分巨大的。 Hibernate适时的填补了这一空白,它为Java应用提供了一个易用的、高效率的对象关系映射框架。hibernate是个轻量级的持久性框架,功 能却非常丰富。优点:a.Hibernate 使用 Java 反射机制而不是字节码增强程序来实现透明性。b.Hibernate 的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。c.它支持各种关系数据库,从一对一到多对多的各种复杂关系。缺点:它限制您所使用的对象模型。(例如,一个持久性类不
12、能映射到多个表)其独有的界面和可怜的市场份额也让人不安,尽管如此,Hibernate 还是以其强大的发展动力减轻了这些风险。其他的开源持久性框架也有一些,不过都没有 Hibernate 这样有市场冲击力。上面回贴情绪有点激动,希望谅解,我不是因为有人批评Hibernate而感到不快,而是因为帖子里面的观点实在让我觉得荒谬。不管觉得 Hibernate好也吧,不好也吧,我唯一觉得遗憾的是,在中文论坛里面找不到一个对Hibernate的真正高水平的评价。在TSS上有一个关于 Hibernate的hot thread,跟了几百贴,其中包括Hibernate作者Gavin和LiDO JDO的CTO,对
13、于JDO和Hibernate有过一些激烈的争论,我曾经耐心的看了一遍,仍然没有发现针对Hibernate真正有力的攻击,那些所 谓的攻击无非针对Hibernate没有一个GUI的配置工具,没有商业公司支持,没有标准化等等这些站不住脚的理由。14.补充几点我的意见:一、Hibernate是JDBC的轻量级的对象封装,它是一个独立的对象持久层框架,和App Server,和EJB没有什么必然的联系。Hibernate可以用在任何JDBC可以使用的场合,例如Java应用程序的数据库访问代码,DAO接口 的实现类,甚至可以是BMP里面的访问数据库的代码。从这个意义上来说,Hibernate和EB不是一
14、个范畴的东西,也不存在非此即彼的关系。二、Hibernate是一个和JDBC密切关联的框架,所以Hibernate的兼容性和JDBC驱动,和数据库都有一定的关系,但是和使用它的Java程序,和App Server没有任何关系,也不存在兼容性问题。三、Hibernate不能用来直接和Entity Bean做对比,只有放在整个J2EE项目的框架中才能比较。并且即使是放在软件整体框架中来看,Hibernate也是做为JDBC的替代者出现的,而 不是Entity Bean的替代者出现的,让我再列一次我已经列n次的框架结构:传统的架构:1) Session Bean Entity Bean DB为了解决
15、性能障碍的替代架构:2) Session Bean DAO JDBC DB使用Hibernate来提高上面架构的开发效率的架构:3) Session Bean DAO Hibernate DB就上面3个架构来分析:1)、内存消耗:采用JDBC的架构2无疑是最省内存的,Hibernate的架构3次之,EB的架构最差。2)、运行效率:如果JDBC的代码写的非常优化,那么JDBC架构运行效率最高,但是实际项目中,这一点几乎做不到,这需要程序员非常精通JDBC,运用 Batch语句,调整PreapredStatement的Batch Size和Fetch Size等参数,以及在必要的情况下采用结果集c
16、ache等等。而一般情况下程序员是做不到这一点的。因此Hibernate架构表现出最快的运行效率。 EB的架构效率会差的很远。3)、开发效率:在有JBuilder的支持下以及简单的项目,EB架构开发效率最高,JDBC次之,Hibernate最差。但是在大的项目,特别是持久层关系映射很复杂的情况下,Hibernate效率高的惊人,JDBC次之,而EB架构很可能会失败。4)、分布式,安全检查,集群,负载均衡的支持由于有SB做为Facade,3个架构没有区别。15.EJB和Hibernate学习难度在哪里?EB的难度在哪里?不在复杂的XML配置文件上,而在于EB运用稍微不慎,就有严重的性能障碍。所以
17、难在你需要学习很多EJB设计模式来避开性能问题,需 要学习App Server和EB的配置来优化EB的运行效率。做EB的开发工作,程序员的大部分精力都被放到了EB的性能问题上了,反而没有更多的精力关注本身就主要 投入精力去考虑的对象持久层的设计上来。Hibernate难在哪里?不在Hibernate本身的复杂,实际上Hibernate非常的简单,难在Hibernate太灵活了。当你用EB来实现持久层的时候,你会发现EB实在是太笨拙了,笨拙到你根本没有什么可以选择的余地,所以你根本就不用花费精力去设计方案,去平衡方案的好坏,去费脑筋考虑选择哪个方案,因为只有唯一的方案摆在你面前,你只能这么做,没
18、得选择。Hibernate相反,它太灵活了,相同的问题,你至少可以设计出十几种方案来解决,所以特别的犯难,究竟用这个,还是用那个呢?这些方案之间到底有什 么区别呢?他们的运行原理有什么不同?运行效率哪个比较好?光是主键生成,就有七八种方案供你选择,你为难不为难?集合属性可以用Set,可以用 List,还可以用Bag,到底哪个效率高,你为难不为难?查询可以用iterator,可以用list,哪个好,有什么区别?你为难不为难?复合主键你 可以直接在hbm里面配置,也可以自定义CustomerType,哪种比较好些?你为难不为难?对于一个表,你可以选择单一映射一个对象,也可以映射成 父子对象,还可以
19、映射成两个1:1的对象,在什么情况下用哪种方案比较好,你为难不为难?这个列表可以一直开列下去,直到你不想再看下去为止。当你面前摆着无数的眼花缭乱的方案的时候,你会觉得幸福呢?还是悲哀呢?如果你是一个负责的程序员, 那么你一定会仔细研究每种方案的区别,每种方案的效率,每种方案的适用场合,你会觉得你已经陷入进去拔不出来了。如果是用EB,你第一秒种就已经做出了决 定,根本没得选择,比如说集合属性,你只能用Collection,如果是Hibernate,你会在Bag,List和Set之间来回犹豫不决,甚至搞 不清楚的话,程序都没有办法写。16.在Hibernate应用中Java对象的状态有哪些?答案:
20、1)瞬时状态(transient):由刚new语句创建,且没有与Hibernate Session关联的对象被称为瞬时的。瞬时对象不会被持久化到数据库中,也不会被赋予持久化标示符(identifier).如果瞬时对象在程序中没有被引用,他会被垃圾回收器回收,使用Hibernate Session可以将其持久化 .通过save() ,saveOrUpdate() ,persist(),merge() 的方法将瞬时对象变为持久化状态 .通过get(),load(),Query.list(),Query.uniqueResult(),Query.iterate(),Query.getResultLi
21、st(),Query.SingleResult(),方法将一个对象变为持久化对象2)持久化状态(persistent):持久化的实例在数据库中有对应的记录,它存在于相关联的Hibernate Session范围内,即加入到Session的缓存中。 .持久化状态通过evict(),close(),clear()等方法会变成托管状态3)托管状态(detached):持久化对象关联的Session被关闭后,对象变为托管状态,托管对象的引用依然有效,对象可以继续被修改。托管对象如果重新关联到某个新的Hibernate Session上,会再次转为持久化。 .托管状态通过update() saveOrU
22、pdate(),merge()等方法会变为持久化状态4)删除状态(Remove):从一个Hibernate Session实例缓存之中删除,Session已经计划将其从数据库删除,Session在清理缓存时,会执行SQL delete语句,删除数据库中对应的记录。值得注意的是删除的是对象标示存在但在一般情况下,应用程序不该在使用被删除的对象17.1.什么是清理缓存?答:1)清理缓存是是指Session按照缓存中库对象的属性变化来同步更新数据库。 Session在缓存进行清理时会自动进行脏检查(没有与数据库同步的数据被称为脏数据),如果发现Session缓存中的对象与数据库中相应的记录不一致,就
23、会同步数据库。17.2.缓存何时清理?1Session缓存中对象的属性每次发生变化,Session不会立即清理缓存以及执行相关的update语句,而是在特定的时间才清理缓存,这样Session就能将几条特定的sql语句合并为一条sql语句,因此就减少了对数据库的访问次数。2Session会在下面的时间点清理缓存:A).当应用程序显示的调用Session的flush()方法时。此时的清理缓存(此时缓存中的数据并不丢失)操作,让缓存和数据库同步执行一些sql语句,但不提交事务。B).当程序在事务下调用commit()方法时,commit方法先清理缓存(调用flush()方法)然后向数据库提交事务。
24、C).当执行一些查询操作时,如果缓存中持久化对象的某些属性发生变化,就会先清理缓存,使得Session缓存与数据库同步,从而保证查询结果返回的是正确数据 18.Session如何进行脏检查?简述缓存的管理?答:(1)当一个对象被加入到Session缓存时,Session会为该对象的值类型的属性复制一份快照,当Session清理缓存时,会进行脏检查,即比较对象的当前属性与他的快照,来判断对象属性是否发生变化,如果发生变化,就称这个对象是脏对象,Session会根据对象的新属性来执行相关的SQL语句,从而同步更新数据库(2).*第一级缓存正常情况下是又Hibernate自动维护的。 *在特殊情况下
25、需要我们进行手动维护(何为手动维护),Hibernate提供了两个管理Session的缓存方法: .void evict(evict ivikt驱逐)(Object obj):把某个持久化对象从Session的缓存中清空,该方法在两个情况下适用,一是特定的操作(如批处理),需要及时释放对象占用的内存,二是不希望当前的Session继续运用此对象的状态变化来同步更新数据库。 .void clear():清理缓存中的所有持久化对象 *在多数情况下并不提倡通过evict()和clear()来管理一级缓存 *管理一级缓存最合理的方式是采用合理的检索策略和检索方式来节省内存的开销。19.映射继承关系的三
26、种方式/策略?答:(1)每个类分层结构一张表:对于继承关系中的子类使用同一张表,这就需要在数据库表中增加额外的区分子类类型的字段,这个额外的字段被称为辨别者列(discriminator)。配置文件如下: . 注意:所有的子类字段都不允许为非空约束(2)继承关系中的每个子类对应一张表,每个表中只包括和这个类本身属性对应的字段,子类的表参照父类对应的表。配置我文件如下: . (3)继承关系中的每个具体类对应一张表:将域模型中的每一个实体对象映射到一个独立的表中,也就是不用再关系数据模型中考虑模型的继承和多态(在具体类对应的表中,不仅包含和具体类属性对应的字段,还包括与具体类的父类属性对应的字段。
27、)配置文件如下: . 注意:同一类继承层次中所有实体类都需要使用同一个主键种子(即需要同一个id),即多个持久化实体对应的记录的主键应该是连续的20映射一对多双向关联关系中设置SET元素:请写出级联保存和更新、级联删除应在set元素中需要设置那些子元素?(标明关系、避面重复执行多余SQL语句)Name cascade key column one-to-many inverse21.请介绍Session以及它的特点有哪些?1)Session建立一个会话,它是应用程序与数据库之间交互操作的一个单线程对象,是Hibernate的运作中心,所有持久化对象必须在Session管理下才能进行持久化操作所
28、有持久层操作的数据都换存在session对象处(相当于jdbc的Connection)。它提供了和持久化相关的操作,如添加、更新、删除、加载和查询对象。注意:Session有连个区域装两个对象:临时和持久2)*.是线程不安全的,因此在设计软件架构时,应该避免多个线程共享同一个Session实例。*.Session实例是轻量级的,所谓轻量级是指它的创建和销毁不需要消耗太多的资源。这意味着在程序中可以经常创建或销毁Session对象,例如为每个客户请求分配单独的Session实例,或者为每个工作单元分配单独的Session实例。*.在Session 中,每个数据库操作都是在一个事务(transac
29、tion)中进行的,这样就可以隔离开不同的操作(甚至包括只读操作)。3)Session类的一些方法:*.取得持久化对象的方法:get(),load()*.持久化对象保存更新和删除:save(),update(),saveOrUpdate(),delete()*.开启事务:beginTransaction*.获得已开启事务:getTransaction*.管理Session的方法:isOpen(),clear(),flush(),evict(),close()22.Hibernate中采用XML文件来配置对象-关系映射的优点有那些?答案:Hibernate既不会渗透到上层域模型中,也不会渗透到下
30、层数据模型中。软件开发人员可以独立设计域模型,不必强迫遵守任何规范。数据库设计人员可以独立设计数据模型,不必强迫遵守任何规范。对象-关系映射不依赖于任何程序代码,如果需要修改对象-关系映射,只需修改XML文件,不需要修改任何程序,提高了软件的灵活性,并且使维护更加方便。23.save()/persist()区别是什么? save()方法把一个瞬间对象加入到Session缓存中,并持久化该瞬时对象,计划执行一个insert语句,计划执行insert语句并不是立即发送SQL语句。在依赖数据库产生主键的情况下会立即发送SQL语句访问数据库,目的是确保为持久化对象的ID赋值,而非数据库产生主键方式,是
31、到清理缓存时才发送SQL语句 persist()和save()方法类似,hibernate3才出现区别: save()方法会返回对象的ID,而persist()方法会什么都不返回 如果在事务边界以外调用persist()方法,那么该方法不会执行insert语句,这可以提高负责长时间运行事务的程序的健壮性。而save()方法,不管是事务边界以外或者以内调用它,都会执行insert语句(使用数据库产生主键的方式)24 叙述Session的缓存的作用答案:(1)减少访问数据库的频率。应用程序从内存中读取持久化对象的速度显然比到数据库中查询数据的速度快多了,因此Session的缓存可以提高数据访问的性
32、能。(2)保证缓存中的对象与数据库中的相关记录保持同步。当缓存中持久化对象的状态发生了变换,Session并不会立即执行相关的SQL语句,这使得Session能够把几条相关的SQL语句合并为一条SQL语句,以便减少访问数据库的次数,从而提高应用程序的性能。25.比较Hibernate的三种检索策略优缺点,分别适用于哪种场合?答案:1)立即检索;优点:对应用程序完全透明,不管对象处于持久化状态,还是托管状态,应用程序都可以方便的从一个对象导航到与它关联的对象;缺点:1.select语句太多;2.可能会加载应用程序不需要访问的对象白白浪费许多内存空间;2)延迟检索:优点:由应用程序决定需要加载哪些
33、对象,可以避免可执行多余的select语句,以及避免加载应用程序不需要访问的对象,节省内存空间,提高检索效率缺点:应用程序如果希望访问托管状态代理类实例,必须保证他在持久化状态时已经被初始化;适用:一对多或多对多关联。应用程序不需要立即访问或者根本不会访问的对象。3).迫切左外连接检索优点:1对应用程序完全透明,不管对象处于持久化状态,还是托管状态,应用程序都可以方便的从一个对象导航到另一个与它相关联的对象。2使用了外连接,select语句数目少。缺点:1可能会加载应用程序不需要访问的对象,白白浪费许多内存空间;2复杂的数据库表连接也会影响检索性能;适用:一对一或多对一关联。应用程序需要立即访
34、问的对象。数据库系统具有良好的表连接性能。26.多个事务并发运行时的并发问题有哪些?答案 第一类丢失更新;脏读;虚读;不可重复读;第二类丢失更新;27.ORM(对象关系映射)解决的不匹配问题(域模型与关系模型之间存在的不匹配)答:域模型是面向对象的,关系模型是面向关系的。域模型中有继承关系,关系模型中不能直接表示继承关系。域模型中有多对多关联关系,关系模型中通过连接表来表示多对多关联关系。域模型中有双向关联关系,关系模型中只有单向参照关系,而且总是many参照one方。域模型提倡精粒度模型,关系模型提倡粗粒度模型。28.session的清理和清空有什么区别?session清理缓存是指按照缓存中
35、对象的状态的变化来同步更新数据库;清空是session关闭;29.关联:one-to-manyinverse:主控方,外键的关系有谁控制inverse=false 是主控方,外键是由它控制的inverse=true 是被控方,外键与它没关系要想实现主控方的控制必须将被控方作为主控方的属性cascade:级联主表增从表增主表修从表修主表删从表删lazy:延迟 lazy=false:一下将所有的内容取出,不延时(常用)lazy=true:取出部分内容,其余内容动态去取通过get可以取出对方的所有内容30.hibernate中的one-to-many或many-to-one中常用的方式是什么? 主控
36、方在many这边,不及连删除31.iBatis与Hibernate有什么不同?相同点:屏蔽jdbc api的底层访问细节,使用我们不用与jdbc api打交道,就可以访问数据。jdbc api编程流程固定,还将sql语句与java代码混杂在了一起,经常需要拼凑sql语句,细节很繁琐。ibatis的好处:屏蔽jdbc api的底层访问细节;将sql语句与java代码进行分离;提供了将结果集自动封装称为实体对象和对象的集合的功能,queryForList返回对象集合,用queryForObject返回单个对象;提供了自动将实体对象的属性传递给sql语句的参数。Hibernate是一个全自动的orm
37、映射工具,它可以自动生成sql语句,ibatis需要我们自己在xml配置文件中写sql语句,hibernate要比ibatis功能负责和强大很多。因为hibernate自动生成sql语句,我们无法控制该语句,我们就无法去写特定的高效率的sql。对于一些不太复杂的sql查询,hibernate可以很好帮我们完成,但是,对于特别复杂的查询,hibernate就很难适应了,这时候用ibatis就是不错的选择,因为ibatis还是由我们自己写sql语句。32.介绍一下Hibernate的二级缓存按照以下思路来回答:(1)首先说清楚什么是缓存,(2)再说有了hibernate的Session就是一级缓存
38、,即有了一级缓存,为什么还要有二级缓存,(3)最后再说如何配置Hibernate的二级缓存。(1)缓存就是把以前从数据库中查询出来和使用过的对象保存在内存中(一个数据结构中),这个数据结构通常是或类似Hashmap,当以后要使用某个对象时,先查询缓存中是否有这个对象,如果有则使用缓存中的对象,如果没有则去查询数据库,并将查询出来的对象保存在缓存中,以便下次使用。下面是缓存的伪代码:引出hibernate的第二级缓存,用下面的伪代码分析了Cache的实现原理Daohashmap map = new map();User getUser(integer id)User user = map.get
39、(id)if(user = null)user = session.get(id);map.put(id,user);return user;DaoCache cache = nullsetCache(Cache cache)this.cache = cacheUser getUser(int id)if(cache!=null)User user = cache.get(id);if(user =null)user = session.get(id);cache.put(id,user);return user;return session.get(id);(2)Hibernate的Sess
40、ion就是一种缓存,我们通常将之称为Hibernate的一级缓存,当想使用session从数据库中查询出一个对象时,Session也是先从自己内部查看是否存在这个对象,存在则直接返回,不存在才去访问数据库,并将查询的结果保存在自己内部。由于Session代表一次会话过程,一个Session与一个数据库连接相关连,所以Session最好不要长时间保持打开,通常仅用于一个事务当中,在事务结束时就应关闭。并且Session是线程不安全的,被多个线程共享时容易出现问题。通常只有那种全局意义上的缓存才是真正的缓存应用,才有较大的缓存价值,因此,Hibernate的Session这一级缓存的缓存作用并不明
41、显,应用价值不大。Hibernate的二级缓存就是要为Hibernate配置一种全局缓存,让多个线程和多个事务都可以共享这个缓存。我们希望的是一个人使用过,其他人也可以使用,session没有这种效果。(3)二级缓存是独立于Hibernate的软件部件,属于第三方的产品,多个厂商和组织都提供有缓存产品,例如,EHCache和OSCache等等。在Hibernate中使用二级缓存,首先就要在hibernate.cfg.xml配置文件中配置使用哪个厂家的缓存产品,接着需要配置该缓存产品自己的配置文件,最后要配置Hibernate中的哪些实体对象要纳入到二级缓存的管理中。明白了二级缓存原理和有了这个
42、思路后,很容易配置起Hibernate的二级缓存。扩展知识:一个SessionFactory可以关联一个二级缓存,也即一个二级缓存只能负责缓存一个数据库中的数据,当使用Hibernate 的二级缓存后,注意不要有其他的应用或SessionFactory来更改当前数据库中的数据,这样缓存的数据就会与数据库中的实际数据不一致。 33.Query1).个或多个属性查询:Query query=session.createQuery(”select customername,customerid from Customer”)List l=query.list();For(int i=0;il.siz
43、e();i+)Obejct object=(Object)l.get(i);Object0 object1 2).配置的查询,在*.hbm.xml中 Query query=session.getNamedQuery(sql);34.ORM解决的不匹配问题(域模型与关系模型之间存在的不匹配)答: 域模型是面向对象的,关系模型是面向关系的。域模型中有继承关系,关系模型中不能直接表示继承关系。域模型中有多对多关联关系,关系模型中通过连接表来表示多对多关联关系。域模型中有双向关联关系,关系模型中只有单向参照关系,而且总是many参照one方。域模型提倡精粒度模型,关系模型提倡粗粒度模型。35.说下H
44、ibernate的缓存机制1). 内部缓存存在Hibernate中又叫一级缓存,属于应用事物级缓存2). 二级缓存: a 应用及缓存 b 分布式缓存 条件:数据不会被第三方修改、数据大小在可接受范围、数据更新频率低、同一数据被系统频繁使用、非 关键数据 c 第三方缓存的实现36.谈谈你对Hibernate的理解。答:1). 面向对象设计的软件内部运行过程可以理解成就是在不断创建各种新对象、建立对象之间的关系,调用对象的方法来改变各个对象的状态和对象消亡的过程,不管程序运行的过程和操作怎么样,本质上都是要得到一个结果,程序上一个时刻和下一个时刻的运行结果的差异就表现在内存中的对象状态发生了变化。
45、2).为了在关机和内存空间不够的状况下,保持程序的运行状态,需要将内存中的对象状态保存到持久化设备和从持久化设备中恢复出对象的状态,通常都是保存到关系数据库来保存大量对象信息。从Java程序的运行功能上来讲,保存对象状态的功能相比系统运行的其他功能来说,应该是一个很不起眼的附属功能,java采用jdbc来实现这个功能,这个不起眼的功能却要编写大量的代码,而做的事情仅仅是保存对象和恢复对象,并且那些大量的jdbc代码并没有什么技术含量,基本上是采用一套例行公事的标准代码模板来编写,是一种苦活和重复性的工作。3).通过数据库保存java程序运行时产生的对象和恢复对象,其实就是实现了java对象与关系数据库记录的映射关系,称为ORM(即Object Relation Mapping),人们可以通过封装JDBC代码来实现了这种功能,封装出来的产品称之为ORM框架,Hibernate就是其中的一种流行ORM框架。使用Hibernate框架,不用写JDBC代码,仅仅是调用一个save方法,就可以将对象保存到关系数据库中,仅仅是调用一个get方法,就可以从数据库中加载出一个对象。4).使用Hibernate的基本流程是:配置
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 冬凌草种子行业市场发展及发展趋势与投资战略研究报告
- 中国纱卡裤项目投资可行性研究报告
- 2025年中国外卖行业市场前景预测及投资方向研究报告
- 2024-2030年辅助生殖市场前景展望与投资策略研究研究报告
- 年组装5000万套医疗器械项目可行性研究报告建议书
- 中国烟草物流行业市场前景预测及投资战略研究报告
- 中国铝钢丝项目投资可行性研究报告
- 中国衣帽擦项目投资可行性研究报告
- 关于编制间硝基苯乙酮项目可行性研究报告编制说明
- 2025劳动合同法第规定
- 医院院长年终工作总结报告精编ppt
- 大连市小升初手册
- 《自然辩证法》课后习题答案自然辩证法课后题答案
- 造价咨询结算审核服务方案
- 中国人民财产保险股份有限公司机动车综合商业保险条款
- 燃气工程监理实施细则(通用版)
- E车E拍行车记录仪说明书 - 图文-
- 人才梯队-继任计划-建设方案(珍贵)
- 《健身气功》(选修)教学大纲
- 王家岩隧道工程地质勘察报告(总结)
- 《昆明的雨》优质课一等奖(课堂PPT)
评论
0/150
提交评论