1. Hibernate简介:
Hibernate对数据库结构提供了较为完整的封装,Hibernate的O/R Mapping实现了POJO和数据库表之间的映射,以及SQL的自动生成和执行。程序员只需定义好了POJO到数据库表的映射关系,即可通过Hibernate提供的方法完成持久层操作。程序员不需要对SQL的熟练掌握,Hibernate/OJB会根据指定的存储逻辑,自动生成对象的SQL并调用JDBC接口加以执行。
2. MyBatis的简介:
MyBatis的着力点在于POJO与SQL之间的映射关系,然后通过映射配置文件,将SQL所需的参数,以及返回的结果字段映射到指定POJO。相对Hibernate“O/R”而言,MyBatis是一种”Sql Mapping”的ORM实现。
3. 什么是hibernate的并发机制?怎么去处理并发机制?
Hibernate的Session对象是非线程安全的,那些支持并发运行的,例如Http request,session beans将会导致出现资源争用。如果在HttpSession中有Hibernate的Session的话,就可能会出现同步访问Http Session。只要用足够快的的点击浏览器的“刷新”就会导致两个并发的线程使用同一个Session。
多个事务并发访问同一块资源,可能会引发第一类丢失更新,脏读,幻读,不可重复读,第二类丢失更新一系列的问题。
解决方案:设置事务隔离级别。
4. Hibernate的五个核心接口:
Configuration接口:配置Hibernate,根据其启动hibernate,创建SessionFactory对象。
SessionFactory接口:初始化Hibernate,充当数据存储源的代理,创建session对象,SessionFactory是线程安全的,意味着它的同一个实例可以被应用的多个线程共享,是重量级、二级缓存。
Session:接口:负责保存、更新、删除、加载和查询对象,是线程不安全的,避免多个线程共享一个session,是轻量级、一级缓存。
Transaction接口:管理事务。
Query和Criteria接口:执行数据库查询。
5. Update和SaveOrUpdate的区别:
Update和saveOrUpdate是用来对跨Session的PO进行状态管理的。
Update()方法操作的对象必须是持久化了的对象,也就是说如果此对象不在数据库中的话就不能使用update()方法。
saveOrUpdate()方法操作的对象既可以是持久化了的,也可以是没有持久化的对象。如果是持久化了的对象调用saveOrUpdate()则会更新数据库中的对象;如果未持久化的对象使用此方法,则save到数据库中。
6. Hibernate的三种状态之间如何转换:
当对象由瞬时状态(Transient)-save()时就变成了持久化状态。
当我们在Session里存储对象的时候,实际是在Session的Map里存了一份,也就是它的缓存里放了一份,然后又到数据库里存了一份,在缓存里这一份叫持久对象(persistent)。Session-Close()了它的缓存也都关闭了整个Session也就失效了,这个时候这个对象变成了游离状态(Detached),但数据库中还是存在的。
当游离状态(Detached)update()时,又变成了持久状态(Persistent)。
当持久状态(persistent)delete()时,又变成了瞬时状态(Transient),此时,数据库中没有与之对应的记录。
7. 比较hibernate的三种检索策略优缺点
a. 立即检索:对应用程序完全透明,不管对象处于持久化状态还是游离状态,应用程序都可以方便的从一个对象导航到与它关联的对象。缺点是select语句太多可能会加载应用程序不需要访问的对象白白浪费内存空间。
b. 延迟检索:由应用程序决定需要加载哪些对象,可以避免可执行多余的select语句,以及避免加载应用程序不需要访问的对象,因此能提高检索性能,并且节省内存空间。缺点是应用程序如果希望访问游离状态代理类实例,必须保证它在持久化状态时已经被初始化。
c. 迫切左外连接检索:对应用程序完全透明,不管对象处于持久化状态还是游离状态,应用程序都可以方便地冲一个对象导航到与它关联的对象,使用了外连接select语句数目少。缺点时可能会加载应用程序不需要访问的对象,白白浪费许多内存空间,复杂的数据库连接也会影响检索性能。
8. 如何在控制台看到hibernate生成并执行的sql.
在定义数据库和数据库属性的文件applicationConfig.xml里面,把hibernate.show_sql设置为true。
9. Hibernate里面的sorted collection和ordered collection有什么区别
Sorted collection是在内存中通过Java比较器进行排序的;
Ordered collection是在数据库中通过order by进行排序的。
10. Hibernate工作原理及为什么要用?
读取并解析配置文件;读取并解析映射信息,创建SessionFactory;打开Session;创建事务Transation;持久化操作;提交事务;关闭Session;关闭SessionFactory。
对JDBC访问数据库的代码做了封装,大大简化了数据访问层的重复性代码。
11. 如何优化Hibernate:
a.使用双向一对多关联,不使用单向一对多;b.灵活使用单向一对多关联;c.不用一对一,用多对一取代;d.配置对象缓存,不使用集合缓存;e.一对多集合使用bag,多对多集合使用set;f.继承类使用显示多态;g.表字段要少,表关联不要怕多,有二级缓存。