【Jsp精品源码栏目提醒】:本文主要为网学会员提供“Hibernate面试题汇总 - 招聘面试”,希望对需要Hibernate面试题汇总 - 招聘面试网友有所帮助,学习一下!
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导航对象图查询 2OID 查询 3HQL 4QBC 5本地 SQL2.load和 get的区别load 加载方法:Users user Userssession.loadUsers.class userIdget 加载方法:Users user Userssession.getUsers.class userId两加载方法区别:区别 1:如果数据库中,没有 userId 的对象。
如果通过 get 方法加载,则返回的是一个 null;如果通过 load 加载,则返回一 个 代 理 对 象 , 如 果 后 面 代 码 如 果 调 用 user 对 象 的 某 个 属 性 ( 比 如 user.getPassword ) 会 抛 出 异 常 :org.hibernate.ObjectNotFoundException;区别 2:load 支持延迟加载,get 不支持延迟加载。
也就是说:Users user Userssession.loadUsers.class userId这句代码不会去执行数据库查询,只有用到 user 时才会去执行数据库查询。
而:Users user Userssession.getUsers.class userId则立即去执行数据库查询。
所以 Users user Userssession.loadUsers.class userId不会执行任何 sql。
注意:Users user Userssession.loadUsers.class userIdSystem.out.printlnuser.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、Criteriaobject 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,但数据库中还是存在的。
当游离状态Detachedupdate时,又变为了持久状态Persistent。
当持久状态Persistentdelete时,又变为了瞬时状态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-15 from table13.什么是 Hibernate 的并发机制?怎么去处理并发问题?Hibernate 并发机制:a、Hibernate 的 Session 对象是非线程安全的对于单个请求单个会话单个的工作单元即单个事务单个线程它通常只使用一次然后就丢弃。
如果一个 Session 实例允许共享的话,那些支持并发运行的例如 Http requestsession 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.UPGRADELockMode.UPGRADE_NOWAITLockMode.READ14. Hibernate 与 jdbc 的联系hibernate 是 jdbc 的轻量级封装,包括 jdbc 的与数据库的连接(用 hibernate.property 的配置文件实现当然本质是封装了 jdbc ,和查询,删除等代码,都用面向对象的思想用代码联系起来,hibernate 通过 hbm 配置文件把 po 类的字段和的 forname)数据库的字段关联起来比如数据库的 id在 po 类中就是 pravite Long id public Long getId public setIdLong id然后 hql 语句也是面向对象的,它的查询语句不是查询数据库而是查询类的这些实现的魔法就是 xml 文件, 其实 hibernate封装的 jdbcxml 文件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 中能否使用 maxsumsount等组函数?能21.hql 中能否使用 Group by 能22.hql 中加 select 和不加 select 的区别不加 select 会根据用户所提供的条件查询数据,并打成所映射的对象加了 select 则不会23.Hql 中 query.uniqueResult和 query.list的区别?前者指返回一个对象,后者返回一个 list 集合24.简述一下 qbcqbcquery 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 二级高速缓存的经验1.Hibernate3 的二级缓存和 session 级别的缓存一样都只对实体对象做缓存,不对属性级别的查询做缓存;二级缓存的生命周期和 sessionFactory 的生命周期是一样的,sessionFactory 可以管理二级缓存; (一般把一些不经常2.sessionFactory 级别的缓存,需要手动配置;所有的 session 可以共享 sessionFactory 级别的缓存;变化的实体对象放到 sessionFactory 级别的缓存中,适合放不经常变化的实体对象。
)3.Hiberante3 二级缓存的配置和使用方法如下:必须把 ehcache.jar 包导入,然后到 Hibernate3.2 的 etc 文件下把 ehcache.xml 复制到工程 src 目录 下(ehcache.xml 里边的参数里边有详细英文说明) ;说明:ehcache.jar 是第三方法的缓存产品,hiberante 只是把它做了集成,还有好多第三方 hibernate 集成的缓存产品,相关说明请查阅 hiberante3 开发手册;ehcache 是不支持分布应用的,如果有分布式需求,请换成支持分布式的二级缓存产品, ;hiberate3 开发手册都有相头说明。
配置方法都类似)4.Hibernate3 的二级缓存默认是开起的,也可以指定开起。
12.Hibernate 的延迟加载怎么看?当 Hibernate 查询数据的时候,数据并没有存在于内存中,当数据真正对数据操作时,才存在于内存中,就实现了延迟加载,他节省了服务器内存的开销,从而提升了服务器的性能。
13.hibernate 的 sessionFactory 说说是管理 session 的一个工厂,由 sessionFactory 的相关方法返回 session 对象,而不是平常的 new 关键字创建 session,它的另一个好处就是,你只管要 session 而不用管它是如何产生的。
这样在效率和安全性是比较好的。
什么事 O/RM对象关心映射是一种为了解决面向对象与关心数据库互不匹配的技术。
简单的说,orm 是通过使用描述对象和数据库之间映射的元数据,将 java 程序中的对象自动持久化到关系数据库中,本质上就是将数据从一种形式转换到另一种形式。
在 o/rm 中 java 中的类名,属性,对象分别转换为数据库中的什么?类名--表名属性--字段对象--记录Hibernate 笔试题1一般情况下,关系数据模型与对象模型之间有哪些匹配关系(多选)A表对应类B记录对应对象C表的字段对应类的属性D表之间的参考关系对应类之间的依赖关系2以下关于 SessionFactory 的说法哪些正确?(多选)A对于每个数据库事务,应该创建一个 SessionFactory 对象B一个 SessionFactory 对象对应一个数据库存储源。
CSessionFactory 是重量级的对象,不应该随意创建。
如果系统中只有一个数据库存储源,只需要创建一个。
DSessionFactory 的 load方法用于加载持久化对象3Customer 类中有一个 Set 类型的 orders 属性,用来存放 Order 订单对象,在 Customer.hbm.xml 文件中,用哪个元素映射 orders 属性?A B C D4元素有一个 cascade 属性,如果希望 Hibernate 级联保存集合中的对象,casecade 属性应该取什么值?(单选)AnoneBsaveCdeleteDsave-update5以下哪些属于 Session 的方法?AloadBsaveCdeleteDupdateEopenFclose6以下程序的打印结果是什么?(单选)tx session.beginTransactionCustomer c1Customersession.loadCustomer.classnew Long1Customer c2Customersession.loadCustomer.classnew Long1System.out.printlnc1c2tx.commitsession.closeA运行出错,抛出异常B打印 falseC打印 true7以下程序代码对 Customer 的 name 属性修改了两次:tx session.beginTransactionCustomer customerCustomersession.loadCustomer.classnew Long1customer.setNameJackcustomer.setNameMiketx.commit执行以上程序,Hibernate 需要向数据库提交几条 update 语句?(单选)A0 B1 C2 D38在持久化层,对象分为哪些状态?(多选)A临时状态B独立状态C游离状态D持久化状态9对于以下程序,Customer 对象在第几行变为持久化状态?(单选)Customer customernew Customer //line1customer.setNameTom //line2Session session1sessionFactory.openSession //line3Transaction tx1 session1.beginTransaction //line4session1.savecustomer //line4tx1.commit //line5session1.close //line6A line1 Bline2 Cline3 Dline4 Eline5 Fline610对于以下程序,Customer 对象在第几行变为游离状态?(单选)Customer customernew Customer //line1customer.setNameTom //line2Session session1sessionFactory.openSession //line3Transaction tx1 session1.beginTransaction //line4session1.savecustomer //line4tx1.commit //line5session1.close //line6A line1 Bline2 Cline3 Dline4 Eline5 Fline611以下哪一种检索策略利用了外连结查询?(单选)A立即检索 B延迟检索 C迫切左外连结检索12假设对 Customer 类的 orders 集合采用延迟检索策略,编译或运行以下程序,会出现什么情况(单选)Session sessionsessionFactory.openSessiontx session.beginTransactionCustomer customerCustomersession.getCustomer.classnew Long1tx.commitsession.closeIterator orderIteratorcustomer.getOrders.iteratorA 编译出错 B编译通过,并正常运行 C编译通过,但运行时抛出异常13关于 HQL 与 SQL,以下哪些说法正确?(多选)AHQL 与 SQL 没什么差别BHQL 面向对象,而 SQL 操纵关系数据库C在 HQL 与 SQL 中,都包含 selectinsertupdatedelete 语句DHQL 仅用于查询数据,不支持 insertupdate 和 delete 语句14事务隔离级别是由谁实现的?(单选)AJava 应用程序 BHibernate C数据库系统 DJDBC 驱动程序15悲观锁与乐观锁,哪个具有较好的并发性能?(单选)A悲观锁 B乐观锁
上一篇:
rvds4.0编译器用户指南
下一篇:
顶棚装饰工程施工