6.操作持久化对象

 

 

1.Session缓存

    java对象生命周期:空引用    隔离引用   

    缓存:

    缓存介于应用程序和永久性存储源之间,其作用是降低应用程序直接读写永久性存储源的频率,从而      提高应用的运行效率。  

    缓存内的数据是永久性存储源中的数据的复制,应用程序在运行时从缓存读写数据,在特定的时刻或      事件同步缓存和永久性存储源的数据。

    Session缓存:   

    Session 接口的实现类 SessionImpl 中定义了一系列的 Java 集合,这些集合构成了 Session 的缓          存。

    Session缓存的工作过程:   

     当 Session 执行查询方法时,先从 Session 缓存中读取据,如果缓存中有则直接读取,如果缓存中       没有,从数据库中查询并加载到 Session 缓存中,再从缓存中读取。
     当 Session 执行 save()、update() 方法时,将对象持久化到数据库中并将对象加载到 Session 缓存中。      

Session实现缓存

Session session = sessionfactory.openSession();
Transaction tx =           
      session.beginTransaction();

User u1 = new User("Tom");
session.save(u1);// 假设分配u的OID=3
tx.commit();     // 提交事务
u1 = null;
User u2 = session.load(User.class,
                  new Integer(3));
u1 = session.load(User.class,
                  new Integer(2)); 
session.close(); // session关闭
u2 = null;
u1 = null;
Session清理缓存

Session在某一时间点按照缓存中对象的属性变化来同步更新数据库的这一过程被称为 Session 清理缓存。
缓存清理的时间点:
当调用 transaction.commit() 方法时,会先清理缓存,再向数据库提交事务;
当显式调用 Session.flush() 方法时,会清理缓存;
当调用 Session 的查询(不包括 load() 和 get() )方法时,如果缓存中对象的属性有变化则清理缓存。

 

Session 对象快照

Session session = sessionfactory.openSession();
Transaction tx =           
      session.beginTransaction();

User user = session.get(User.class,
                  new Integer(1));

user.setName("Jack");

tx.commit();
Session清理缓存的方式


setHibernateFlushMode() 用于设定 Session 清理缓存的模式。

清理缓存模式

Session的查询方法

commit()

flush()

FlushMode.ALWAYS

清理

清理

清理

FlushMode.AUTO

缓存中对象的属性有变化时清理,没变化不清理

清理

清理

FlushMode.COMMIT

不清理

清理

清理

FlushMode.MANUAL

不清理

不清理

清理

FlushMode.NEVER

已过时,被MANUAL取代

 

        Session的三大作用:

        Session缓存有三大作用:

        减少数据库访问次数,提高数据访问的效率;

       保证缓存中的对象与数据库中相关的记录同步;

       当缓存中的持久化对象存在循环关联关系时,Session会保证不出现死循环,以及由死循环引起的堆栈溢出异常。

 

2.Hibernate对象的生命周期

    Hibernate实体对象生命周期

    实体对象的4种状态

    Transient(临时状态) : 刚刚被 new 关键字创建,还没有被持久化,不在Session的缓存中。

     Persistent(持久化状态) : 已经被持久化,并加入到 Session 缓存中。

     Detached(游离状态) : 已经被持久化,但不再处于 Session 缓存中。

     Removed(删除状态) : Session 已经计划将其从数据库删除,并且不再处于 Session 缓存中。

 

 

 

 

清理缓存模式

Session的查询方法

commit()

flush()

FlushMode.ALWAYS

清理

清理

清理

FlushMode.AUTO

缓存中对象的属性有变化时清理,没变化不清理

清理

清理

FlushMode.COMMIT

不清理

清理

清理

FlushMode.MANUAL

不清理

不清理

清理

FlushMode.NEVER

已过时,被MANUAL取代

3.Hibernate操作持久化对象

Session的save()方法
1. 把对象加入缓存中,使其变成持久化对象;
2. 根据映射文件配置的标识符生成器为对象分配一个 OID;
3. 计划执行一个 insert,把对象当前属性值组装到 insert 语句中;
4. 事务提交后(transaction.commit())永久的将数据保存到数据库。
Session的update()方法

1. 把游离对象重新加入 Session 缓存中,使其变为持久化对象;
2. 计划执行一个 update,将对象当前属性组装到 update 语句,执行 update 语句;
3. 事务提交后(transaction.commit())永久的将数据保存到数据库;
4. 不管对象属性有没有改变都会执行update (通过select-before-update=true改设置<class>的变)。

Hibernate 如何区分临时对象
Hibernate 如何区分临时对象:
对象的 OID 为 null;
如果映射文件中设置了 <id> 的 unsaved-value 属性,并且对象的 id 值与 unsaved-value 设置的值相等。
Session的delete()方法
1.. 检查传入的参数是否是持久化对象,如果是持久化对象将其移出 Session 缓存;
2. 计划执行一个 delete,但是并不立即执行;
3. 当 Session 清理缓存时才执行 delete,比如执行 Session.flush()。

 

Session的load()和get()方法
load() 与 get() 方法都是根据 OID 加载持久化对象。
load() 与 get() 方法的不同点:
如果数据库中不存在与 OID 对应的记录:
load() 会抛出 ObjectNotFoundException 异常;
get() 会返回 null。
默认加载策略:
load() 使用类的延迟加载策略;
get() 使用类的立即加载策略。

 

转载于:https://www.cnblogs.com/Firesun/p/9848638.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
持久化问题(永久存储信息的访问)是面向对象开发和企业应用开发需要面临的问题,而 关系型数据库是目前保存数据的有效手段,因此如何在对象层(Object)和关系数据库 (Relational)之间建立一种好的机制,可以更有效的改进开发的效率和质量。目前在 Java环境下存在很多O/R框架,如EJB的EntityBean模式、JDO、OJB等,但Windows和 .Net环境下有效的O/R映射框架却很少(微软正在开发类似的技术Microsoft ObjectSpace,还有NetPersistent和JPersistent等)。 Pdo(Persistent Data Object)是适用于Microsoft .Net环境下的O/R映射方式的持久性 处理框架。Pdo能够使处理持久化数据(需要保持在关系型数据库中的数据)采用";;;;;;;持久化 对象";;;;;;;的方式,对于面向对象设计来说是处理对象持久化问题的自然方式。在传统的开 发方式中,通常需要书写代码使用像ADO或Microsoft .Net Data Provider等数据访问 引擎来读取、更新和增加数据,需要维护关于底层数据库的信息。然而Pdo对数据以对 象和属性的方式进行处理,而不再需要了解如何处理表的纪录,以及数据的来源等底层 的数据库信息。 更多介绍,http://www.marshine.com。(现已开放源码) 发布声明 a.. 当前版本仅供技术预览,用于交流,存在很多设计不当的地方,建议不要用于实 际项目。 b.. 欢迎大家提供意见。 c.. 个人开发作品。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值