什么是ORM?
把数据库中的关系数据映射为程序中的对象,让Java操作数据库变得和操作对象一样简单,针对关系型数据库而言
持久层设计要考虑的问题有哪些?你用过的持久层框架有哪些?
封装的JDBC,既要面向对象,又要抽象编程,缓存机制,并发问题,线程问题,事务回滚与提交。
hibernate:全自动,重量级,开发速度快,性能差,可通过操作对象操作数据库。
MyBatis:半自动,轻量级,SQL语句优化强,开发速度慢。
hibernate中sessionfactory是线程安全的吗?session是线程安全的吗?(两个线程能够共享同一个session吗)
sessionfactory是线程安全的,可以被多个线程并发访问,session是一个轻量级非线程安全的对象(线程间不能共享session)
hibernate中session的load和get方法的区别是什么?
① 如果没有找到符合条件的记录,get方法返回null,load方法抛出异常。
② get方法直接返回实体类对象,load方法返回实体类对象的代理。
③ 在hibernate3之前,get方法只在一级缓存中进行数据查找,如果没有找到对应的数据则越过二级缓存,直接发出SQL语句完成数据读取;load方法则可以从二级缓存中获取数据;从hibernate3开始,get方法不再是对二级缓存只写不读,它也是可以访问二级缓存的
Query接口的list方法和iterate方法有什么区别?
① list()方法无法利用一级缓存和二级缓存(对缓存只写不读),它只能在开启查询的前提下使用查询缓存;iterate()方法可以充分利用缓存,如果目标数据只读或者读取频繁,使用iterate()方法可以减少性能开销。
② list()方法不会引起N+1查询问题,而iterate()方法可能引起N+1查询问题。
hibernate如何实现分页查询?
通过hibernate实现分页查询,开发人员只需要提供HQL语句(调用session的createQuery()方法)或查询条件(调用session的createCriteria()方法)、设置查询起始行数(调用Query或Criteria接口的setFirstResult()方法)和最大查询行数(调用Query或Criteria接口的setMaxResults()方法),并调用Query或Criteria接口的list()方法,hibernate会自动生成分页查询的SQL语句。
锁机制有什么用?简述hibernate的悲观锁和乐观锁机制。
有些业务逻辑在执行过程中要求对数据进行排他性的访问,于是需要通过一些机制保证在此过程中数据被锁住不会被外界修改,这就是锁机制。
悲观锁:悲观的认为在数据处理过程中极有可能存在修改数据的并发事务,于是将处理的数据设置为锁定状态。
乐观锁:对并发事务持乐观态度,通过更加宽松的锁机制来解决由于悲观锁排他性的数据访问对系统性能造成的严重影响。
阐述实体对象的三种状态以及转换关系。
瞬时态:
持久态:
游离态:
如何理解hibernate的延迟加载机制?在实际应用中,延迟加载与session关闭的矛盾是如何处理的?
延迟加载就是并不是在读取的生活就把数据加载进来,而是等到使用时再加载。
① 关闭延迟加载特性。
② 在session关闭之前先获取需要查询的数据,可以使用工具方法hibernate.islnitialized()判断对象是否被加载,如果没有被加载则可以使用hibernate.initialize()方法加载对象。
③ 使用拦截器或过滤器延长session的生命周期直到视图获得数据。