1. 读取并解析配置文件
Hibernate 的初始化 , 读取Hibernate 的配置信息-->创建SessionFactory
//采用默认的hibernate.cfg.xml来启动一个Configuration的实例
例 : Configuration configuration = new Configuration().configure();
//如要修改默认配置文件名 当然你可以选择不修改
Configuration configuration=new Configuration().configure(new File("src/xxx.xml"));
Configuration 说明 :
负责管理 Hibernate 的配置信息 , 这些配置信息都是从配置文件 hibernate.cfg.xml 或者 hibernate.properties 读取的 , 也可以自定义文件名称 , 只要在实例化 Configuration 时指定具体的路径即可
2. 读取并解析映射信息 , 创建 SessionFactory
例 : SessionFactory factory = configuration.buildSessionFactory();
sessionFactory 说明 :
Configuration 的实例会根据当前的配置信息构造 sessionFactory 实例 , 他是线程安全的 , 一般情况下一个应用中的一个数据库共享一个该实例
3. 打开 Session 实例 ( 它是线程不安全的 , 是共享同一个 session , 所以要 ThreadLocal 模式来控制 )
例 : Session session = factory.openSession();
sesion 说明 :
一般的持久化方法都是通过 Session 来调用的 ,Session 是非线程安全的
4. 创建事务 Transaction
例 : Transaction transaction = session.beginTransaction();
5. CRUD 操作 ( 执行数据操作 CRUD 增删查改 )
例 : 增加 : session.save(pojo 对象 );
增加或者修改 :session.saveOrOpdate(pojo 对象 ) // 当修改时候 ,id 不存在将被抛出异常
session.update(student);
session.delete(student);
Student student = (Student)session.get(Student. class , 23); // 根据主键加载
p1=(Person)session.load(pojo 类 .class, 主键值 );
6. 提交事务
例 : transaction.commit();
7. 关闭 Session 实例及 SessionFactory
例 : session.close();
factory.close();
说明 :
一、 持久层对象的生命周期:
在执行 session.save(user) 之前 , 首先要获取 session 对象 ,PO 只有在 Session 的管理下才可完成数据库访问 , 按 PO 与 Session 的关系 ,持久化对象 可有如下三个状态 :
1 、瞬时对象(Transient Object) :使用new 操作符初始化的对象不是立刻就持久的。它们的状态是瞬时的,也就是说它们没有任何跟数据库表相关联的行为,只要应用不再引用这些对象( 不再被任何其它对象所引用) ,它们的状态将会丢失,并由垃圾回收机制回收。
特征:
在数据库没有与之对应的记录;
没有纳入session 的管理(在session 中没有此对象);
2 、持久化对象(Persistent Object) :持久实例是任何具有数据库标识的实例,它有持久化管理器Session 统一管理,持久实例是在事务中进行操作的---- 它们的状态在事务结束时同数据库进行同步。当事务提交时,通过执行SQL 的INSERT 、UPDATE 和DELETE 语句把内存中的状态同步到数据库中。
特征:
持久化对象在数据库中有与之匹配的数据;
纳入了session 的管理;
在清理缓存(脏数据检查)的时候会与数据库同步,也就是说当属性发生改变的时候,Hibernate 会自动的与数据库同步;
3 、托管(离线)对象(Detached Object) :Session 关闭之后,持久化对象就变为离线对象。离线表示这个对象不能再与数据库保持同步,它们不再受hibernate 管理。
特征:
在数据库中有与之匹配的数据;
没有纳入session 的管理;
三种状态的转换
1 、当一个对象new 完之后就会变成Transient 状态(Session 未开启),Transient 状态的对象随时都可能被垃圾回收机制回收。
2 、当Transient 状态的对象被执行了save 或saveOrUpdate 方法后(Session 开启且Session 未关闭)它就会变成一个persistent 状态。
3 、当persistent 状态的对象在Session 执行了evict 、close 、clear 方法后(Session 关闭)它就会变成Detached 状态。Detached 状态的对象也可以随时被垃圾回收机制回收。
4 、当Detached 状态的对象调用update 、saveOrUpdate 、lock 方法后(Session 开启并且Session 未关闭),这个对象会变成persistent 状态,当Session 调用evict 、close 、clear 方法后(Session 关闭)它又会变成Detached 状态。
5 、当persistent 状态的对象在调用delete 方法后会变成Transient 状态(Session 关闭)。
6 、hibernate 执行get 、load 、find 等方法(Session 开启且Session 未关闭),此时得到的对象是persistent 状态。
二、对 PO 的操作必须在 Session 管理下才能与数据库同步 ,Session 由 SessionFactory 实例提供 ,SessionFactory 是数据库编译后的内存镜像 , 通常一个应用对应一个 SessionFactory 对象。
因为SessionFactory是数据库的内存镜像,可以想象他消耗的资源,而且他是线程安全的,即可以被多个线程同时访问,所以在一个应用中,最好将SessionFactory封装为一个静态变量 ;
三、Session
session是Hibernate中非常重要的一个类,通常使用的是org.hibernate,Session,他有如下特点:
单线程,短寿命对象,代表了一次会话的过程,实际上是把一个JDBC Connection打包了,他可以包含一些持久化对象的缓存,看作介于数据连接与事务管理一种中间接口
每一个Session实例和一个数据库事务绑定 ,就是说,每执行一个数据库事务操作,都应该先创建一个新的Session实例。如果事务执行中出现异常,应该撤销事务。不论事务执行成功与否,最后都应该调用Session的close方法。从而释放Session实例占用的资源;
四、获得Session对象:
首先获得SessionFactory对象,应用服务器如果访问多个数据源时,则应该产生多个SessionFactory;但是仅仅为了服务与某个请求时,不要创建一个新的SessionFactory,因为创建SessionFactory需要消耗大量的资源,然后再根据SessionFactory创建出Session对象
五、Session接口中的常用方法:
基本的CRUD操作
1、save():把java对象保存在数据库中
2、update():更新数据库中的java对象
3、delete():把java对象从数据库中删除
4、find():从数据库中查询java对象
5、load()和get():它们都是根据给定的OID从数据库中加载一个对象
get 与load 区别说明:
1、 get 不支持lazy ,load 支持lazy (延迟加载or 懒加载);
2、 get 在调用时,会立刻发出sql 语句,而load 在调用时,不会发出sql 语句,只有真正使用这个对象的时候才会发出sql 语句;
3、 采用get 加载数据时,当数据库中没有与之对应的数据时,返回null ,而采用load 方法加载数据时,当数据库中,没有与之对应的数据时,会抛出异常;