【php精品源码栏目提醒】:网学会员为需要php精品源码的朋友们搜集整理了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 本来是对数据库的一些
上一篇:
基于Sphinx构建Web站内全文搜索系统的研究
下一篇:
那些令你为之触动的好句子,感慨万分