Hibernate介绍
Hibernate是一个基于ORM的持久化层框架,它对JDBC进行了轻量级的对象封装,使开发人员可以使用面向对象的编程思想来操作数据库
HIbernate充当Dao层,根据POJO与实体类的映射配置自动生成SQL语句。
orm 思想. 对象关系映射. 通过映射文件配置对象与数据库中表的关系
O 对象
R 关系型数据库
M 映射文件
Hibernate体系结构
SessionFactory接口:生成S二十四欧尼的工厂,负责创建Session对象需要使用生成JDBC的工厂ConnectionProvider接口。
Session接口是hibernate应用程序提供的操作数据库的接口,隐藏了JDBC连接,提供了基本的保存,更新,删除,和加载java对象的方法。Session对象是非线程安全的,具有一个缓冲,位于缓存中的对象(与Hibernate Sessio关联的对象)称为持久化对象。
线程安全就是在多线程环境下也不会出现数据不一致,而非线程安全就有可能出现数据不一致的情况。
Hibernate对象状态
- 瞬时状态
- 没有id,没有与session关联(没有在session缓存中):customer.setCust_name("");
- 持久化状态
- 有id,与session关联(在session缓存中):session.save(customer);
- 特点:持久化状态对象的任何变化自动同步到数据库中
- 游离/托管状态
- 有id,没有与session关联(没有在session缓存中):session.close();
Customer c1 = new Customer();
c1.setCust_id(1l);
设置id不存在对应瞬时,存在则游离
- 有id,没有与session关联(没有在session缓存中):session.close();
hibernate使用原则:将我们希望同步到数据库的数据,对应的对象转换成持久化状态
配置文件
orm元数据xxx.hbm.xml映射配置文件
hibernate.cfg.xml配置数据库连接
Hibernate事务
Service层
HibernateUtils.getCurrentSession().beginTransaction();
操作事务
HibernateUtils.getCurrentSession().getTransaction().commit();
HibernateUtils.getCurrentSession().getTransaction().rollback();
Dao层
Session session = HibernateUtils.getCurrentSession();
session.get();
-
事务特性
- A — 原子性
事务可以看做数据库操作的容器,对事务所包裹的操作被认为像物理上的原子,是最小、不可分割的单位,要么全成功,要么全失败 - C — 一致性
事务在提交前后数据总量不应该发生变化(赖以保证的基础是原子性) - I — 隔离性
多个事务在并发产生的时候,可能会产生一些负面问题(脏读、不可重复读、幻读)
提供隔离级别解决 - D — 持久性
保证事务提交之后,涉及到操作的数据必须被写入持久化介质(如硬盘)中
- A — 原子性
-
事务并发问题
- 脏读
某事务读到了另一个事务正在操作但未提交的数据 - 不可重复读
一次事务中两次连续的读取到的数据内容不一致(过程中其他事务修改数据并提交了) - 幻/虚读
一次事务中两次连续的读取到的数据数量不一致(过程中其他事务增加数据并提交了)
- 脏读
解决方法:
- 事务的隔离级别
1)read uncommitted : 读取尚未提交的数据 :哪个问题都不能解决
2)read committed:读取已经提交的数据 :可以解决脏读 ---- oracle默认的
3)repeatable read:重读读取:可以解决脏读 和 不可重复读 —mysql默认的
4)serializable:串行化:可以解决 脏读 不可重复读 和 虚读—相当于锁表操作数据只允许串行,不允许并发