zoukankan      html  css  js  c++  java
  • NHibernate系列文章七:NHibernate对象状态

    摘要

    • NHibernate对象持久化
    • NHibernate对象的三个状态:临时态、持久态、游离态(托管态)
    • NHibernate三状态的相互转化

    1. NHibernate对象持久化

    NHibernate的对象持久化是指将NHibernate的POCO对象写入到持久化对象集合,POCO对象变成持久化状态,以及从数据库中用NHibernate查询出POCO对象,写入到持久化对象集合,查询出的POCO对象具有持久化状态的过程。

    NHibernate用XML映射的实体对象类符合POCO(简单传统CLR对象)模型。

    POCO模型类定义应具有以下三个特点:

    • 不继承于除Object以外任何类
    • 不继承任何接口
    • 不具有任何Attribute修饰

    NHibernate都是自动管理对象的状态和状态的变化的,但是理解他的状态和状态变化有助于我们更深刻的理解NHibernate其他方面(二级缓存、并发控制)。

    2. NHibernate对象的三个状态

    • 临时态:使用new创建的临时NHibernate实体对象的状态是临时态
    • 持久化态:使用NHibernate查询出的实体对象的状态是持久态,具有持久态的对象的主键对应的属性值不为空。持久化态对象被Session进行管理。
      • 临时态的对象,如果在持久化对象集合里不存在,经过session.Save方法变成持久态,写入持久化对象集合,并将新对象写入数据库
      • 临时态的对象,如果在持久化对象集合里存在,经过session.SaveOrUpdate变成持久态,修改持久化对象集合中的对象,并将修改写入数据库
    • 游离态:处于持久化状态的对象,如果session关闭,或者调用了session.Clear方法或session.Evict方法,将对象置于游离态。处于游离态的对象如果再次被session.SaveUpdate或session.Save,重新变回持久态

      其他变化:

    • 处于持久化状态和游离状态的对象,调用session.Delete方法,都将状态变成临时态
    • 处于临时态的对象和游离态的对象,都被.net垃圾回收机制GC进行管理,在必要的时候进行垃圾回收

    3. 代码演示

    修改Main函数

     1         static void Main(string[] args)
     2         {
     3             var session = SessionFactory.OpenSession();
     4             bool contains = false;
     5             //临时态
     6             Customer customer = CreateCustomer();
     7             contains = session.Contains(customer); //持久化状态的对象被session管理
     8             Console.WriteLine("Is Persistent:{0}", contains);
     9 
    10             //临时态 -> 持久态
    11             session.Save(customer);
    12             contains = session.Contains(customer);
    13             Console.WriteLine("Is Persistent:{0}", contains);
    14 
    15             //持久态 -> 游离态
    16             session.Evict(customer); //或 session.Clear();
    17             contains = session.Contains(customer);
    18             Console.WriteLine("Is Persistent:{0}", contains);
    19 
    20             //游离态 -> 持久态
    21             customer.LastName = "Chen";
    22             session.SaveOrUpdate(customer);
    23             session.Flush(); //将修改马上写入数据库
    24             contains = session.Contains(customer);
    25             Console.WriteLine("Is Persistent:{0}", contains);
    26 
    27             //持久态 -> 临时态
    28             session.Delete(customer);
    29             session.Flush(); //将修改马上写入数据库
    30             contains = session.Contains(customer);
    31             Console.WriteLine("Is Persistent:{0}", contains);
    32 
    33             Console.ReadLine();
    34         }

    整个添加、修改和删除过程都用同一个session进行,演示了整个session管理对象状态的过程。

    如果对象是持久态,则调用session.Contains(object)方法返回true,否则(临时态或游离态)返回false。

    修改hibernate.cfg.xml文件,将show_sql属性注释掉,去掉生成的sql语句的干扰。

    <?xml version="1.0" encoding="utf-8" ?>
    <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
      <session-factory>
        <property name="connection.connection_string_name">default</property>
        <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
        <property name="dialect">NHibernate.Dialect.MsSql2008Dialect</property>
        <!--<property name="show_sql">true</property>-->
        <mapping assembly="NHibernateDemoApp"/>
      </session-factory>
    </hibernate-configuration>

    清空数据库表Customer后,运行该程序得到结果

    • 使用关键字new创建新Customer对象后,该Customer对象为临时态
    • 调用session.Save方法后写入数据库,该Customer对象变为持久态
    • 关闭session后,该Customer对象没有Session进行托管了,状态变成游离态
    • 修改Customer对象属性后,调用session.SaveOrUpdate将修改写入数据库,状态由游离态变回持久态
    • 删除Customer对象后,从持久化对象集合里删除了该对象,状态变成了临时态
  • 相关阅读:
    DataGrid内容导出Excel文件(C#)
    IE无法查看源文件原因及解决办法
    通过Internet访问内网中的服务器
    工欲善其事,必先利其器——图文并茂详解VisualStudio使用技巧
    Flash中对动态文本框使用遮罩
    Flash中XML跨域访问数据的规则
    Google导航代码
    信息竞赛小结
    第一天,开始系统学习 void
    浅析各种数据类型的取值范围 void
  • 原文地址:https://www.cnblogs.com/uncle_danny/p/5635552.html
Copyright © 2011-2022 走看看