Hibernate建立数据库连接的时序图如下:
![](https://box.kancloud.cn/04768a345b93e642ac337f55b348110a_772x576.png)
我们简单解释以下几点:
* 1,2,3,4,5,6,7,8的目的在于获取一个用于可以制造session(会话)的工厂,即sessionFactory。可以认为这是固有的写法。
* 每个数据库都对应一个sessionFactory。所以在一般的程序中,如果只涉及到对一个数据表进行操作,那么仅仅需要一个sessionFactory.
* 通过sessionFactory可以获取到用于连接数据库信息的session(会话)。一个sessionFactory可以制造N个session。每个session都可以起到与数据库进行会话的作用。
* 往往我们通过sessionFactory只获取一个(session)对话。
* 数据的提交采用的是事务。什么是事务呢?简单的理解为,事务是一系列的数据表操作。即一个事务,对应着先后执行N条SQL语句。采用事务的好处就是,如果多条语句中,有一条没有成功执行,事务会自动的进行回滚操作。
* 比如在银行转账时,张三转钱给李四,那么我们需要增加李四的钱的同时减少张三的钱。
* 我们把这样两条SQL语句放到事务中,由事务进行提交执行。
* 假设增加李四的钱的操作被正常的执行了,而执行减少张三的钱的时候,恰恰发生了错误。
* 这时,事务监测到了这个错误,从而回滚增加李四钱的操作。
* 最终达到了:发生错误时,李四的钱不增多,张三的钱不减少。
* Hibernate进行了惰性连接处理。在开启事务时,才会尝试对数据库进行连接。
> 想测试配置信息是否正确,则必须执行至开启事务。
# 测试
```
package hibernate;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
import org.junit.Test;
import java.util.List;
import java.util.Properties;
public class TestCfgXml {
@Test
public void TestConfig() {
try {
// 实例化
Configuration configuration = new Configuration();
// 加载数据库配置文件
configuration.configure();
// 读取数据库配置信息
Properties configs = configuration.getProperties();
// 实例化服务注册对象构造器(用于构造服务对象)
ServiceRegistryBuilder serviceRegistryBuilder = new ServiceRegistryBuilder();
// 传入数据库配置信息
serviceRegistryBuilder.applySettings(configs);
// 构造服务注册对象
ServiceRegistry serviceRegistry = serviceRegistryBuilder
.buildServiceRegistry();
// 创建会话工厂(session factory))
SessionFactory sessionFactory = configuration
.buildSessionFactory(serviceRegistry);
// 创建会话(这里的session也是会话的意思,我们以前接触的http中的session,处理的是用户与服务器的对话)
Session session = sessionFactory.getCurrentSession();
// 开启事务(使用缓冲池进行数据库的连接)
session.beginTransaction();
// 关闭session
session.close();
} catch (Exception e) {
System.out.println("发生错误:");
System.out.println(e);
}
}
}
```
此时,我们在hibrenate.cfg.xml中将数据库名javaee更改为javaee1,再进行测试。将得到如下错误:
```
ERROR: Unknown database 'javaee1'
发生错误:
org.hibernate.exception.SQLGrammarException: Could not open connection
```
提示我们数据库未找到。当然了,我们还可以更改其它的配置选项,来查看具体的配置信息错误时的出错信息.
## 参考资料:
sesssion与sessionFactory:
[http://blog.csdn.net/jiangxindu1/article/details/48037731](http://blog.csdn.net/jiangxindu1/article/details/48037731)
[https://docs.jboss.org/hibernate/orm/3.5/reference/zh-CN/html/transactions.html](https://docs.jboss.org/hibernate/orm/3.5/reference/zh-CN/html/transactions.html)
事务:
[http://www.jianshu.com/p/eb150b4f7ce0](http://www.jianshu.com/p/eb150b4f7ce0)
- README
- 第一章:准备
- 第二章:Hello World!
- 第一节:查看工程文件
- 第二节:JDK、JRE与环境变量
- 第三节:index.jsp
- 第三章:Hello Struts
- 第一节:Web.xml
- 第二节:单入口
- 第三节:Hello Struts
- 第四节:触发C层
- 第四章:建立数据表
- 第一节:建立实体类
- 第二节:测试一
- 第三节:测试二
- 第四节:引入Hibernate
- 第五节:配置Hibernate
- 第六节:建立连接
- 第七节:实体类映射数据表
- 第八节:完善数据表
- 第五章:教师管理
- 第一节:增加数据--add
- 第二节:增加数据--save
- 1 获取传入数据数据
- 2 数据写入测试
- 3 对接C层
- 第三节:数据列表
- 1 获取数据
- 2 重构代码
- 3 C层对接--初始化
- 4 C层添加数据
- 5 V层显示数据
- 6 获取数据库中数据
- 7 显示性别
- 8 分页
- 9 条件查询
- 第四节:修改数据
- 1 edit
- 2 update
- 第五节:删除数据
- 第六节:总结
- 第六章:重构C层
- 第一节:继承ActionSupport类
- 第二节:数据验证
- 第七章:前台分离(前台)
- 第一节:环境搭建
- 第二节:运行环境
- 第三节:共享开发环境
- 第四节:生产环境
- 第八章:前台开发(前台)
- 第一节:本地化
- 第二节:教师列表
- 1 引入M层
- 2 模拟后台返回数据
- 3 C与M对接
- 4 C与V对接
- 第九章:前后台对接(前后台)
- 第一节:后台输出json(后台)
- 第二节:对接前台(全栈)
- 第二节:对接API(前台)
- 第二节:跨域请求(后台)
- 第三节:重构代码(前台)
- 第十章:重构后台M层
- 第一节:数据访问DAO层
- 第二节:项目整体重构
- 第十一章:用户登陆(前后台)
- 第一节:制定规范
- 第二节:定制测试用例
- 第三节:后台输入测试代码(后台)
- 第四节:postman(后台)
- 第五节:新建用户登陆模块(前台)
- 第六节:代码重构(前台)
- 第十二章:班级管理(前后台)
- 第一节:班级列表
- 1 原型开发
- 2 制定规范
- 3 后台对接开发
- 4 前台对接开发
- 第二节:Add
- 1 原型开发
- 2 制定规范
- 3 后台对接开发
- 4 前台对接开发
- 第三节:Save
- 1 制定规范
- 2 后台对接开发
- 3 前台对接开发
- 第四节:Edit
- 1 原型开发
- 2 制定规范
- 3 后台对接开发
- 4 前台对接开发
- 第五节:Update
- 1 制定规范
- 2 后台对接开发
- 3 前台对接开发
- 第六节:Delete
- 1 制定规范
- 2 后台对接开发
- 3 前台对接开发
- 第七节:小结
- 第十三章:班级管理(API)
- 第一节:ER图
- 第二节:create
- 1 实体层
- 2 dao层
- 3 service(server)层
- 4 action层
- 第三节:ManyToOne
- 第四节:Read
- 1 service(server)层
- 2 action层
- 第五节:update
- 1 service(server)层
- 2 action层
- 第六节:update
- 第十四章:重构服务层