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使用乐观锁来处理脏数据问题
- 假设数据库中产品的价格是10000,version是10
- session1,session2分别获取了该对象
- 都修改了对象的价格
- session1试图保存到数据库,检测version依旧=10,成功保存,并把version修改为11
- session2试图保存到数据库,检测version=11,说明该数据已经被其他人动过了。 保存失败,抛出异常
11.C3P0连接池
建立数据库连接时比较消耗时间的,所以通常都会采用数据库连接池的技术来建立多条数据库连接,并且在将来持续使用,从而节约掉建立数据库连接的时间
hibernate本身是提供了数据库连接池的,但是hibernate官网也不推荐使用他自带的数据库连接池。
一般都会使用第三方的数据库连接池
C3P0是免费的第三方的数据库连接池,并且有不错的表现 ,点击获取。
提取码:c2p1