Hibernate 基本概念总结

ORM与持久化映射

1.阐述实体对象的三种状态以及转换关系
Hibernate有三种状态,分别是:瞬时态、持久态、游离态、移除态

  • 瞬时态:当new一个实体对象后,这个对象处于瞬时态,即这个对象只是一个保存临时数据的内存区域,如果没有变量引用这个对象,则会被垃圾回收机制回收。这个对象与数据库没有任何关系。除非通过session的save()等方法把瞬时态对象与数据库做关联,保存到数据库中,这个对象才被称为持久态
  • 持久态 : 持久态对象的实例在数据库中有对应的记录,并拥有一个持久化标识(ID)。对持久态对象进行delete操作后,数据库中的记录将被移除,那么持久态对象将不会与数据库有关联,及持久态对象将会被转换为移除态
  • 游离态 : 当Session进行了close(),clear(),evict()或flush()后,实体对象从持久态变成游离态,对象虽然拥有持久和数据库对应记录一致的标识值,但是因为对象已经从会话清除掉,对象不再持久化管理之内,所以称为游离态。

延迟加载、性能优化

1.Hibernate 中的sessionFactory是线程安全的吗?Session是线程安全的吗?(两个线程是否可以共享同一个session)
SessionFsctory是安全的,可以被多个线程并发访问。SessionFactory一般只会在启动的时候创建。Session是一个轻量级非线程安全的对象(线程间不能共享session),它表示与数据库进行交互的一个工作单元。Session是由SessionFsctory创建的,在任务完成的时候它会被关闭

2.Hibernate中Session的load 和 get 区别是什么?
主要有三个区别:

  • 如果没有找到符合条件的记录,get方法返回null ,而 load方法抛出异常
  • get方法直接返回实体类对象,load方法返回实体类对象的代理
  • 在Hibernate3之前,get方法指在一级缓存中进行数据查找,如果没有找到对应的数据,则直接越过二级缓存,直接发出sql语句完成数据读取;load方法则可以从二级缓存中获取数据。

3.如何理解Hibernate的延迟加载机制?在实际应用中,延迟加载与Session关闭的矛盾如何处理?
延迟加载就是并不是在读取的时候就把数据加载进来,而是等到使用时再加载。

延迟加载与session关闭的矛盾一般可以这样处理:

  • 关闭延迟加载特性。这种方式操作起来比较简单,因为Hibernate的延迟加载特性是可以通过映射文件或者注解进行配置的,但这种解决办法存在明显缺陷。
  • 在session关闭之前先获取需要查询的数据,可以使用工具方法Hibernate.isInitialized()判断对象是否被加载,如果没有加载则可以使用Hibernate.isInialize()方法加载对象。
  • 使用拦截器或过滤器延长Session的生命周期查到视图获得数据。

4.简述Hibernate常见的优化策略

  • 制定合理的缓存机制(二级缓存、查询缓存)
  • 采用合理的Session管理机制
  • 尽量使用延迟加载的特性
  • 设定合理的批处理参数
  • 如果可以,选用基于版本号的乐观锁替代悲观锁
  • 在开发过程,开启hibernate.show_sql选项查看生成的sql,从而了解底层的状况,开发完成后关闭此选项

5.锁机制有什么用?简述Hibernate的悲观锁和乐观锁机制?
有些业务逻辑在执行过程中要求对数据进行排他性访问,于是需要通过一些机制保证在此过程中数据被锁住不会被外界修改,这就是所谓的锁机制

  1. 悲观锁,悲观的认为在数据处理过程中极有可能存在修改数据的并发事务,于是将处理的数据设置为锁定状态。悲观锁必须依赖数据库本身的锁机制才能真正保证数据访问的排他性。
  2. 乐观锁,对并发事务持乐观态度,通过更加宽松的锁机制来解决有悲观锁排他性的数据访问对性能造成的严重影响。最常见的乐观锁是通过数据版本标识来实现的,读取数据时获得数据的版本号,更新数据时将此版本加1,然后和数据库表对应记录的当前版本号进行比较,如果提交的数据版本号大于数据库中此记录的当前版本号则更新数据,否则认为是过期数据无法更新。Hibernate中通过Session的get()和load()从数据库中加载对象时可以通过参数指定使用悲观锁;而乐观锁可以通过给实体类加整型的版本字段再通过XML进行注解配置。

使用乐观锁会增加一个版本字段,很明显这需要额外的空间来存储这个字段,浪费空间,但是乐观锁会让系统具有更好的并发性。

HQL查询、条件查询、sql查询

1.Hibernate如何实现分页查询?
通过Hibernate实现分页查询,开发人员只需要提供HQL语句(调用Session的createQuery())或查询条件(调用session的createCriteria()的方法)、设置查询起始行数(调用Query或Criteria接口的setMaxResults()方法),并调用Query或Criteria接口的list()方法,Hibernate会自动生成sql语句

二级缓存和查询缓存

Hibernate的Session提供了一级缓存,默认总是有效的,当应用程序保存持久化实体、修改持久化实体时,Session并不会立即把这种改变提交到数据库中,而是缓存在当前的Session中,除非调用Session的flush()方法或通过close()方法关闭Session,通过一级缓存,可以减少程序与数据库的交互,从而提高数据库的访问性能。
SessionFactory的Session提供了二级缓存是全局的,所有Session可以共享这个二级缓存。不过二级缓存默认是关闭的,需要显示开启并指定需要使用哪种二级缓存实现类,一旦开启了二级缓存并设置了需要使用二级缓存的实现类,SessionFactory就会缓存访问过的该实体类的每个对象,除非缓存数据超出了指定的缓存空间。
一级缓存和二级缓存都是对整个实体进行缓存,不会缓存普通属性,如果希望对普通属性进行缓存,可以使用查询缓存

												***帅气的远远啊***
发布了61 篇原创文章 · 获赞 50 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_41585840/article/details/104132125