`

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

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 关闭)。

6 hibernate 执行getloadfind 等方法(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 不支持lazyload 支持lazy (延迟加载or 懒加载);

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

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

分享到:
评论

相关推荐

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     8.3 Java对象在Hibernate持久化层的状态  8.3.1 临时对象的特征  8.3.2 持久化对象的特征  8.3.3 被删除对象的特征  8.3.4 游离对象的特征  8.4 Session接口的详细用法  8.4.1 Session的save()和persist()...

    精通hibernate:对象持久化技术孙卫琴第二版part2

    本章站在持久化层的角度,Java对象在生命周期中可处于临时状态、持久化状态、删除状态和游离状态。处于持久化状态的Java对象位于一个Session实例的缓存中,Session能根据这个对象的属性变化来同步更新数据库。 8.1 ...

    精通Hibernate:对象持久化技术第二版part3

    本章站在持久化层的角度,Java对象在生命周期中可处于临时状态、持久化状态、删除状态和游离状态。处于持久化状态的Java对象位于一个Session实例的缓存中,Session能根据这个对象的属性变化来同步更新数据库。 8.1 ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

     8.3 Java对象在Hibernate持久化层的状态  8.3.1 临时对象的特征  8.3.2 持久化对象的特征  8.3.3 被删除对象的特征  8.3.4 游离对象的特征  8.4 Session接口的详细用法  8.4.1 Session的save()和persist()...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

     8.3 Java对象在Hibernate持久化层的状态  8.3.1 临时对象的特征  8.3.2 持久化对象的特征  8.3.3 被删除对象的特征  8.3.4 游离对象的特征  8.4 Session接口的详细用法  8.4.1 Session的save()和persist()...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part1.rar

     8.3 Java对象在Hibernate持久化层的状态  8.3.1 临时对象的特征  8.3.2 持久化对象的特征  8.3.3 被删除对象的特征  8.3.4 游离对象的特征  8.4 Session接口的详细用法  8.4.1 Session的save()和persist()...

    Struts2.3.8整合Hibernate4.2,Spring3.2lucene 3 6 2 SSH整合1.0版

    Struts2.3.8、Hibernate4.2和Spring3.2是Java开发中的三大主流框架,它们分别负责Web层、持久层和业务层的管理,而Lucene 3.6.2则是一个强大的全文搜索引擎库。这个整合版本称为SSH整合1.0版,旨在提供一个高效、...

    JAVA程序开发大全---上半部分

    11.1.2 JSF框架的请求处理生命周期 201 11.1.3 JSF应用程序结构 202 11.2 MyEclipse创建基于JSF框架的项目 202 11.2.1 创建JSF项目 202 11.2.2 JSF配置文件编辑器 203 11.2.3 创建Managed Bean 204 11.2.4 创建JSP...

    Spring3.2Jar官方jar包

    IoC容器管理对象的生命周期和依赖关系,而AOP则提供了一种模块化和解耦代码的方式,使得我们可以编写出更加灵活的代码。 2. **spring-context-3.2.0.RELEASE.jar**:扩展了Spring Core,提供了与企业服务的集成,如...

Global site tag (gtag.js) - Google Analytics