Hibernate 基础概念篇

1.事务

Hibernate的任何对数据有改动的操作,都应该被放在事务里面.
在事务中的多个操作行为,要么都成功,要么都失败

hibernate中的事务由s.beginTransaction();开始
由s.getTransaction().commit();结束

在Mysql中,只有当表的类型是INNODB的时候,才支持事务,所以需要把表的类型设置为INNODB,否则无法观察到事务。

2.延迟加载

hibernate中的延迟加载(lazyload)分属性的延迟加载和关系的延迟加载 。

  • 属性的延迟加载:

    当使用load的方式来获取对象的时候,只有访问了这个对象的属性,hibernate才会到数 据库中进行查询。否则不会访问数据库。

  • 关系的延迟加载:

    延迟加载又叫lazyload,在one-many many-many的时候都可以使用关系的延迟加载。

3.级联

没有配置级联的时候,删除分类,其对应的产品不会被删除。 但是如果配置了恰当的级联,那么删除分类的时候,其对应的产品都会被删除掉。
四种级联:

  • all:所有操作都执行级联操作;
  • none:所有操作都不执行级联操作;此为默认
  • delete:删除时执行级联操作;
  • save-update:保存和更新时执行级联操作;
    级联通常用在one-many和many-to-many上,几乎不用在many-one上。

4.一级缓存

hibernate默认是开启一级缓存的,一级缓存存放在session上。

第一次获取对象的时候,session中是没有对应缓存对象的,所以会出现sql查询语句。
第二次获取对象的时候,session中有对应的缓存对象,所以不会出现sql查询语句。

5.二级缓存

Hibernate的一级缓存是在Session上,二级缓存是在SessionFactory上。

6.分页

使用Criteria进行分页查询 。
无论你使用的是Oracle,Mysql,NoSQL还是DB2,分页查询的代码写法都是一样的

Hibernate使用Criteria 来进行分页查询。
criteria.setFirstResult(2); 表示从第3条数据开始;
criteria.setMaxResults(5); 表示一共查询5条数据。

7.get 和 load

通过id获取Product对象有两种方式,分别是get和load
他们的区别分别在于

  • 延迟加载
  • 对于id不存在的时候的处理

load方式是延迟加载,只有属性被访问的时候才会调用sql语句
get方式是非延迟加载,无论后面的代码是否会访问到属性,马上执行sql语句

id异常时获取对象

  • get方式会返回null
  • load方式会抛出异常

8.Session方式

Hibernate有两种方式获得session,分别是:
openSession和getCurrentSession
他们的区别在于

  • 获取的是否是同一个session对象
    openSession每次都会得到一个新的Session对象 。
    getCurrentSession在同一个线程中,每次都是获取相同的Session对象,但是在不同的线程中获取的是不同的Session对象 。
  • 事务提交的必要性
    openSession只有在增加,删除,修改的时候需要事务,查询时不需要的 。
    getCurrentSession是所有操作都必须放在事务中进行,并且提交事务后,session就自动关闭,不能够再进行关闭 。

9.N+1

Hibernate有缓存机制,可以通过用id作为key把product对象保存在缓存中 。

同时hibernate也提供Query的查询方式。假设数据库中有100条记录,其中有30条记录在缓存中,但是使用Query的list方法,就会所有的100条数据都从数据库中查询,而无视这30条缓存中的记录 。

N+1是什么意思呢,首先执行一条sql语句,去查询这100条记录,但是,只返回这100条记录的ID
然后再根据id,进行进一步查询。

如果id在缓存中,就从缓存中获取product对象了,否则再从数据库中获取。

10.乐观锁

Hibernate使用乐观锁来处理脏数据问题

  1. 假设数据库中产品的价格是10000,version是10
  2. session1,session2分别获取了该对象
  3. 都修改了对象的价格
  4. session1试图保存到数据库,检测version依旧=10,成功保存,并把version修改为11
  5. session2试图保存到数据库,检测version=11,说明该数据已经被其他人动过了。 保存失败,抛出异常

Hibernate 基础概念篇

11.C3P0连接池

建立数据库连接时比较消耗时间的,所以通常都会采用数据库连接池的技术来建立多条数据库连接,并且在将来持续使用,从而节约掉建立数据库连接的时间
hibernate本身是提供了数据库连接池的,但是hibernate官网也不推荐使用他自带的数据库连接池。
一般都会使用第三方的数据库连接池
C3P0是免费的第三方的数据库连接池,并且有不错的表现 ,点击获取
提取码:c2p1