Hibernate面试题剖析.doc_第1页
Hibernate面试题剖析.doc_第2页
Hibernate面试题剖析.doc_第3页
Hibernate面试题剖析.doc_第4页
Hibernate面试题剖析.doc_第5页
免费预览已结束,剩余3页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

hibernate是什么?hibernate是基于ORM对象关系映射(完成对象数据到关系数据映射的机制)实现的,做数据持久化的工具HttpSession与Hibernate中Session的区别1. javax.servlet.http.HttpSession是一个抽象接口用途:存放这个用户的一些经常被用到的信息,例如:用户名,权限等2. 它是hibernate操作数据库的一个句柄对象 手动或者通过业务层获取0. Hibernate介绍Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。1.Hibernate有哪几种查询数据的方式(1)导航对象图查询 (2)OID查询 (3)HQL (4)QBC (5)本地SQL2.load()和get()的区别load加载方法:Users user = (Users)session.load(Users.class, userId); get加载方法:Users user = (Users)session.get(Users.class, userId);两加载方法区别:区别1:如果数据库中,没有userId的对象。如果通过get方法加载,则返回的是一个null;如果通过load加载,则返回一个代理对象,如果后面代码如果调用user对象的某个属性(比如user.getPassword())会抛出异常:org.hibernate.ObjectNotFoundException;区别2:load支持延迟加载,get不支持延迟加载。也就是说:Users user = (Users)session.load(Users.class, userId); 这句代码不会去执行数据库查询,只有用到user时才会去执行数据库查询。而:Users user = (Users)session.get(Users.class, userId); 则立即去执行数据库查询。 所以Users user = (Users)session.load(Users.class, userId);不会执行任何sql。注意:Users user = (Users)session.load(Users.class, userId); System.out.println(user.getId(); 上面这2句代码,不会去执行数据库操作。因为load后会在hibernate的一级缓存里存放一个map对象,该map的key就是userId的值,但是当你getId()时,它会去一级缓存里拿map的key值,而不去执行数据库查询。所以不会报任何错。不会执行任何数据库操作。2.1请解释Session的load方法和get方法的不同;以及Query的list和iterator方法的不同load():现在session缓存中寻找,如果找到了返回该对象,如果没找到,程序会新建一个对象,并且返回,存在session中,不会在数据库中查找,在程序中如果没有用到这个实体类,可以节省一次数据库连接。如果在程序中用到了这个实体类,这个实体类就会在数据库去查找,如果没有查找到就会抛异常。(延时加载)get():在缓存在查找,如果找到该对象,返回该对象。如果没找到,会到数据库中查找,如果数据库中有则返回该对象,如果没找到这返回空。(立即加载)3. Hibernate工作原理及为什么要用?原理:1. 读取并解析配置文件2. 读取并解析映射信息,创建SessionFactory3. 打开Sesssion4. 创建事务Transation5. 持久化操作6. 提交事务7. 关闭Session8. 关闭SesstionFactory为什么要用:1. 对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。2. Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作3. hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。4. hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。4 Hibernate是如何延迟加载?1. Hibernate2延迟加载实现:a)实体对象 b)集合(Collection)2. Hibernate3 提供了属性的延迟加载功能当Hibernate在查询数据的时候,数据并没有存在与内存中,当程序真正对数据的操作时,对象才存在与内存中,就实现了延迟加载,他节省了服务器的内存开销,从而提高了服务器的性能。5.0 Hibernate中怎样实现类之间的关系?(如:一对多、多对多的关系)类与类之间的关系主要体现在表与表之间的关系进行操作,它们都市对对象进行操作,我们程序中把所有的表与类都映射在一起,它们通过配置文件中的many-to-one、one-to-many、many-to-many、5 说下Hibernate的缓存机制1. 内部缓存存在Hibernate中又叫一级缓存,属于应用事物级缓存2. 二级缓存:a) 应用及缓存b) 分布式缓存条件:数据不会被第三方修改、数据大小在可接受范围、数据更新频率低、同一数据被系统频繁使用、非 关键数据c) 第三方缓存的实现6 Hibernate的查询方式Sql、Criteria,object comptositionHql:1、 属性查询2、 参数查询、命名参数查询3、 关联查询4、 分页查询5、 统计函数7 如何优化Hibernate?1. 使用双向一对多关联,不使用单向一对多2. 灵活使用单向一对多关联3. 不用一对一,用多对一取代4. 配置对象缓存,不使用集合缓存5. 一对多集合使用Bag,多对多集合使用Set6. 继承类使用显式多态7. 表字段要少,表关联不要怕多,有二级缓存撑腰8. hibernate的三种状态之间如何转换当对象由瞬变状态(Transient)一save()时,就变成了持久化状态。当我们在Session里存储对象的时候,实际是在Session的Map里存了一份,也就是它的缓存里放了一份,然后,又到数据库里存了一份,在缓存里这一份叫持久对象(Persistent)。Session 一 Close()了,它的缓存也都关闭了,整个Session也就失效了,这个时候,这个对象变成了游离状态(Detached),但数据库中还是存在的。当游离状态(Detached)update()时,又变为了持久状态(Persistent)。当持久状态(Persistent)delete()时,又变为了瞬时状态(Transient),此时,数据库中没有与之对应的记录。8.请解释说明Hibernate控制下的POJO会呈现三种状态,分别是transient、persistenet和detached,请解释这三种状态Transient:瞬变状态:数据库中没数据。跟session不相关。没存过。Persistenet:游离态:在数据库中有记录,但是在session中没有。需要手工同步。Detached:持久态:数据库中有记录,session中也有这记录。自动更新9. update()和saveOrUpdate()的区别?update()和saveOrUpdate()是用来对跨Session的PO进行状态管理的。update()方法操作的对象必须是持久化了的对象。也就是说,如果此对象在数据库中不存在的话,就不能使用update()方法。saveOrUpdate()方法操作的对象既可以使持久化了的,也可以使没有持久化的对象。如果是持久化了的对象调用saveOrUpdate()则会更新数据库中的对象;如果是未持久化的对象使用此方法,则save到数据库中10. hibernate中一对多配置文件返回的是什么?hibernate中一对多配置文件会相应的映射为两张表,并且它们之间的关系是一对多的。例如:一个student和classes表的关系 。一个学生只能是一个班的,一个班可以有多个学生。11. Hibernate与spring的联系hibernate中的一些对象可以给Spring来管理,让Spring容器来创建hibernate中一些对象实例化。例如:SessionFactory,HibernateTemplate等。Hibernate本来是对数据库的一些操作,放在DAO层,而Spring给业务层的方法定义了事务,业务层调用DAO层的方法,很好的将Hibernate的操作也加入到事务中来了。12. 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);13.什么是Hibernate的并发机制?怎么去处理并发问题?Hibernate并发机制:a、Hibernate的Session对象是非线程安全的,对于单个请求,单个会话,单个的工作单元(即单个事务,单个线程),它通常只使用一次,然后就丢弃。如果一个Session 实例允许共享的话,那些支持并发运行的,例如Http request,session beans将会导致出现资源争用。如果在Http Session中有hibernate的Session的话,就可能会出现同步访问Http Session。只要用户足够快的点击浏览器的“刷新”,就会导致两个并发运行的线程使用同一个Session。b、多个事务并发访问同一块资源,可能会引发第一类丢失更新,脏读,幻读,不可重复读,第二类丢失更新一系列的问题。解决方案:设置事务隔离级别。Serializable:串行化。隔离级别最高Repeatable Read:可重复读Read Committed:已提交数据读Read Uncommitted:未提交数据读。隔离级别最差设置锁:乐观锁和悲观锁。乐观锁:使用版本号或时间戳来检测更新丢失,在的映射中设置 optimistic-lock=”all”可以在没有版本或者时间戳属性映射的情况下实现 版本检查,此时Hibernate将比较一行记录的每个字段的状态 行级悲观锁:Hibernate总是使用数据库的锁定机制,从不在内存中锁定对象!只要为JDBC连接指定一下隔 离级别,然后让数据库去搞定一切就够了。类LockMode 定义了Hibernate所需的不同的锁定级别:LockMode.UPGRADE,LockMode.UPGRADE_NOWAIT,LockMode.READ;14. Hibernate与jdbc的联系hibernate是jdbc的轻量级封装,包括jdbc的与数据库的连接(用perty的配置文件实现当然本质是封装了jdbc的forname),和查询,删除等代码,都用面向对象的思想用代码联系起来,hibernate通过hbm 配置文件把po类的字段和数据库的字段关联起来比如数据库的id,在po类中就是pravite Long id; public Long getId() ;public setId(Long id);然后hql语句也是面向对象的,它的查询语句不是查询数据库而是查询类的,这些实现的魔法就是xml文件,其实hibernate=封装的jdbc+xml文件15. hibernate拒绝连接、服务器崩溃的原因?最少写5个1. db没有打开2. 网络连接可能出了问题3. 连接配置错了4. 驱动的driver,url是否都写对了5. LIB下加入相应驱动,数据连接代码是否有误6. 数据库配置可能有问题7. 当前联接太多了,服务器都有访问人数限制的8. 服务器的相应端口没有开,即它不提供相应的服务9 hibernate有哪些缓存,分别怎么使用?10 你对hibernate的了解到了一个什么样的程度?11 写出一个sql语句体现hibernate中一对多的关系16.hibernate.cfg.xml文件的作用该配置文件主要用来描述数据库连接的相关信息,以及该应用中关心映射文件所在的位置,和一些其他的设置,该文件一般放在项目的根目录下。17.hibernate中的继承关系按照数据库的表结构来分的话有那几种?1.所有类在一张表中,通过添加一个鉴别字段来区分子类。2.每个子类一张表,父类的字段被分配到每个表中。3.每个类一张表,包括父类和子类,通过父类和子类的ID来体现继承关系18.hibernate中常见的关联关系有那3种?那种事最常见的一对一一对多多对多一对多最常见19.hibernate中的cascade属性的作用:级联操作20.hql中能否使用max(),sum(),sount()等组函数?能21.hql中能否使用Group by?能22.hql中加select和不加select的区别不加select会根据用户所提供的条件查询数据,并打成所映射的对象加了select则不会23.Hql中query.uniqueResult()和query.list()的区别?前者指返回一个对象,后者返回一个list集合24.简述一下qbcqbc(query by criteria)这种ape封装了sql语句的动态拼接,对查询提供了更加面向对象的功能接口25.请解释为什么SessionFactory一般以单例方式使用SessionFactory是一个大型对象,而且线程安全。在一个程序中只需要一个26.请解释说明hibernate配置文件中dialect属性的确切含义数据库方言:多种数据库拥有不同的语言语法,通过设置dialect指定所用的数据库,并生成对应语法和语言的sql语句。27.请解释Hibernate3.2主键的生成方式中,native和identity方式的区别。Native主键生成方式会根据不同的底层数据库自动选择Identity、Sequence、Hilo主键生成方式Identity当时根据底层数据库,来支持自动增长,不同的数据库用不同的主键增长方式28.请简要的描述一下使用Hibernate进行大批量更新的经验直接使用hibernate API 进行批量更新和批量删除都不推荐,而直接通过JDBC API执行相关的SQl语句或调用相关的存储过程是最佳的方式。29.请简要的描述一下使用Hibernate二级高速缓存的经验1Hibernate3的二级缓存和session级别的缓存一样都只对实体对象做缓存,不对属性级别的查询做缓存;二级缓存的生命周期和sessionFactory的生命周期是一样的,sessionFactory可以管理二级缓存;2sessionFactory级别的缓存,需要手动配置;所有的session可以共享sessionFactory 级别的缓存;(一般把一些不经常变化的实体对象放到sessionFactory级别的缓存中,适合放不经常变化的实体对象。)3Hiberante3二级缓存的配置和使用方法如下:必须把ehcache.jar包导入,然后到Hibernate3.2的etc文件下把ehcache.xml复制到工程src目录下(ehcache.xml里边的参数里边有详细英文说明);说明:ehcache.jar是第三方法的缓存产品,hiberante只是把它做了集成,还有好多第三方hibernate集成的缓存产品,相关说明请查阅hiberante3开发手册;ehcache是不支持分布应用的,如果有分布式需求,请换成支持分布式的二级缓存产品,hiberate3开发手册都有相头说明。配置方法都类似);4Hibernate3的二级缓存默认是开起的,也可以指定开起。30.Hibernate的延迟加载怎么看?当Hibernate查询数据的时候,数据并没有存在于内存中,当数据真正对数据操作时,才存在于内存中,就实现了延迟加载,他节省了服务器内存的开销,从而提升了服务器的性能。31.hibernate的sessionFactory说说是管理session的一个工厂,由sessionFactory的相关方法返回session对象,而不是平常的new关键字创建session,它的另一个好处就是,你只管要session而不用管它是如何产生的。这样在效率和安全性是比较好的。32.什么事O/RM?对象关心映射是一种为了解决面向对象与关心数据库互不匹配的技术。简单的说,orm是通过使用描述对象和数据库之间映射的元数据,将java程序中的对象自动持久化到关系数据库中,本质上就是将数据从一种形式转换到另一种形式。33.在o/rm中java中的类名,属性,对象分别转换为数据库中的什么?类名-表名属性-字段对象-记录=Hibernate笔试题=(1)一般情况下,关系数据模型与对象模型之间有哪些匹配关系(多选)ABCA)表对应类B)记录对应对象C)表的字段对应类的属性D)表之间的参考关系对应类之间的依赖关系(2)以下关于SessionFactory的说法哪些正确?(多选)BCA)对于每个数据库事务,应该创建一个SessionFactory对象B)一个SessionFactory对象对应一个数据库存储源。C)SessionFactory是重量级的对象,不应该随意创建。如果系统中只有一个数据库存储源,只需要创建一个。D)SessionFactory的load()方法用于加载持久化对象(3)Customer类中有一个Set类型的orders属性,用来存放Order订单对象,在Customer.hbm.xml文件中,用哪个元素映射orders属性?AA) B) C) D)(4)元素有一个cascade属性,如果希望Hibernate级联保存集合中的对象,casecade属性应该取什么值?(单选)DA)noneB)saveC)deleteD)save-update(5)以下哪些属于Session的方法?ABCDFA)load()B)save()C)delete()D)update()E)open()F)close()(6)以下程序的打印结果是什么?(单选)Ctx = session.beginTransaction();Customer c1=(Customer)session.load(Customer.class,new Long(1);Customer c2=(Customer)session.load(Customer.class,new Long(1);System.out.println(c1=c2);mit();session.close();A)运行出错,抛出异常B)打印falseC)打印true(7)以下程序代码对Customer的name属性修改了两次:Btx = session.beginTransaction();Customer customer=(Customer)session.load(Customer.class,new Long(1);customer.setName(Jack);customer.setName(Mike);mit();执行以上程序,Hibernate需要向数据库提交几条update语句?(单选)A)0 B)1 C)2 D)3(8)在持久化层,对象分为哪些状态?(多选)ACDA)临时状态B)独立状态C)游离状态D)持久化状态(9)对于以下程序,Customer对象在第几行变为持久化状态?(单选)DCustomer customer=new Customer(); /line1customer.setName(Tom); /line2Session session1=sessionFactory.openSession(); /line3Transaction tx1 = session1.beginTransaction(); /line4session1.save(customer); /mit(); /line5session1.close(); /line6A) line1 B)line2 C)line3 D)line4 E

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论