Hibernate3.6.2 原理、开发步骤持久层对象生命周期

 

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 的管理下才可完成数据库访问 , 按 POSession 的关系 ,持久化对象 可有如下三个状态 :

1 、瞬时对象(Transient Object) :使用new 操作符初始化的对象不是立刻就持久的。它们的状态是瞬时的,也就是说它们没有任何跟数据库表相关联的行为,只要应用不再引用这些对象( 不再被任何其它对象所引用) ,它们的状态将会丢失,并由垃圾回收机制回收。

特征:

在数据库没有与之对应的记录;

没有纳入session 的管理(在session 中没有此对象);

2 、持久化对象(Persistent Object) :持久实例是任何具有数据库标识的实例,它有持久化管理器Session 统一管理,持久实例是在事务中进行操作的---- 它们的状态在事务结束时同数据库进行同步。当事务提交时,通过执行SQLINSERTUPDATEDELETE 语句把内存中的状态同步到数据库中。

特征:

持久化对象在数据库中有与之匹配的数据;

纳入了session 的管理;

在清理缓存(脏数据检查)的时候会与数据库同步,也就是说当属性发生改变的时候,Hibernate 会自动的与数据库同步;

3 、托管(离线)对象(Detached Object)Session 关闭之后,持久化对象就变为离线对象。离线表示这个对象不能再与数据库保持同步,它们不再受hibernate 管理。

特征:

在数据库中有与之匹配的数据;

没有纳入session 的管理;

三种状态的转换

1 、当一个对象new 完之后就会变成Transient 状态(Session 未开启),Transient 状态的对象随时都可能被垃圾回收机制回收。

2 、当Transient 状态的对象被执行了savesaveOrUpdate 方法后(Session 开启且Session 未关闭)它就会变成一个persistent 状态。

3 、当persistent 状态的对象在Session 执行了evictcloseclear 方法后(Session 关闭)它就会变成Detached 状态。Detached 状态的对象也可以随时被垃圾回收机制回收。

4 、当Detached 状态的对象调用updatesaveOrUpdatelock 方法后(Session 开启并且Session 未关闭),这个对象会变成persistent 状态,当Session 调用evictcloseclear 方法后(Session 关闭)它又会变成Detached 状态。

5 、当persistent 状态的对象在调用delete 方法后会变成Transient 状态(Session 关闭)。

6hibernate 执行getloadfind 等方法(Session 开启且Session 未关闭),此时得到的对象是persistent 状态。

二、对 PO 的操作必须在 Session 管理下才能与数据库同步 ,SessionSessionFactory 实例提供 ,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从数据库中加载一个对象

getload 区别说明:

1、 get 不支持lazyload 支持lazy (延迟加载or 懒加载);

2、 get 在调用时,会立刻发出sql 语句,而load 在调用时,不会发出sql 语句,只有真正使用这个对象的时候才会发出sql 语句;

3、 采用get 加载数据时,当数据库中没有与之对应的数据时,返回null ,而采用load 方法加载数据时,当数据库中,没有与之对应的数据时,会抛出异常;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值