`

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()...

    低清版 大型门户网站是这样炼成的.pdf

    6.2.4 bean的作用域与生命周期 374 6.2.5 基于xml方式的bean装配 376 6.2.6 基于annotation方式的bean装配 381 6.2.7 基于xml方式的aop实现 386 6.2.8 基于annotation方式的aop实现 391 6.3 spring 2.5事务管理...

    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...

    经典JAVA.EE企业应用实战.基于WEBLOGIC_JBOSS的JSF_EJB3_JPA整合开发.pdf

    该案例采用目前最流行、最规范的java ee架构,整个应用分为jpa实体层、eao层、业务逻辑层、mvc层和视图层,各层之间分层清晰,层与层之间以松耦合的方法组织在一起。该案例既提供了ide无关的、基于ant管理的项目源码...

Global site tag (gtag.js) - Google Analytics