Nhibernate开发专题博客

Nhibernate开发专题博客,为您精选Nhibernate开发教程,助您开发愉快!

公告信息
欢迎光临Nhibernate开发专题博客,祝您开发愉快!
文章档案

NHibernate生命周期:临时态、持久态、游离态-NHibernate入门到精通系列4


本节将为您介绍介绍
NHibernate生命周期的三种状态:临时态、持久态、游离态。

理解好NHibernate生命周期的三种状态,将有助于你更好的深入开发,下面进行介绍:

1:临时态,英文名称:Transient

临时态故名思义就是临时的,它随时将被垃圾回收,而且对数据库没有对应关系。

使用new来创建对象,非持久化,不存入Session。


2:持久态,英文名称:Persistent

已持久化,存入Session,所保存的对象通过GET或Load方法或获取对象。


3:游离态,英文名称:Detached

已持久化,但已被清除出Session,处于游离失散状态。

临时态、持久态、游离态三种状态,在生命周期中可以互相转换,如下图所示:



下面我们使用简单的示例来演示一下NHibernate生命周期的三种状态:临时态、持久态、游离态。

按上节内容基础增删改查-NHibernate入门到精通系列3,准备好项目:

如下图:



1:临时态 演示示例[TransientToPersistentTest]

步骤如下:

A:new一个对象,状态为Transient

B:调用Save()持久化,状态变为Persistent

C:不关Session,修改对象属性,提交事务。


        public void TransientToPersistentTest()
        {
            using (ISession session = this.sessionFactory.OpenSession())
            {
                using (ITransaction tran = session.BeginTransaction())
                {
                    var product = new Product
                    {
                        ID = Guid.NewGuid(),
                        BuyPrice = 10M,
                        Code = "ABC123",
                        Name = "电脑",
                        QuantityPerUnit = "20x1",
                        SellPrice = 11M,
                        Unit = "怠"
                       
                    }; 

                    try
                    {
                        //Persistent
                        session.Save(product);

                        //保存记录后修改数据,观察数据库中数据的变化
                        product.SellPrice = 12M;

                        tran.Commit();
                    }
                    catch (Exception ex)
                    {
                        tran.Rollback();
                        throw ex;
                    }
                }
            }
        }
最终结果如图:



说明:当对象处于Persistent状态,并没有脱离Session管理时,其属性发生改变后,数据库相对应的记录会与之同步。

2:
持久态-游离态 演示示例:

public void PersistentToTestDetached()
        {
            //Transient
            var product = new Product
            {
                ID = Guid.NewGuid(),
                BuyPrice = 10M,
                Code = "ABC123",
                Name = "电脑",
                QuantityPerUnit = "20x1",
                SellPrice = 11M,
                Unit = "台"
            };

            using (ISession session = this.sessionFactory.OpenSession())
            {
                using (ITransaction tran = session.BeginTransaction())
                {               
                    try
                    {
                        //Persistent
                        session.Save(product);
                        product.SellPrice = 12M;

                        tran.Commit();
                    }
                    catch (Exception ex)
                    {
                        tran.Rollback();
                        throw ex;
                    }
                }
            }

            //Detached
            product.SellPrice = 13M;

            using (ISession session = this.sessionFactory.OpenSession())
            {
                using (ITransaction tran = session.BeginTransaction())
                {
                    try
                    {
                        //Persistent
                        session.Update(product);
                        tran.Commit();
                    }
                    catch (Exception ex)
                    {
                        tran.Rollback();
                        throw ex;
                    }
                }
            }
        }
最终结果如图:

补充1:当对象处于游离态(Detached)时,修改其属性,是不会与数据库发生同步的。调用Update()方法后,对象则变回持久态(Persistent)。

补充2:通过Get()方法,是可以得到持久态(Persistent)对象的

补充
3:调用Get()方法后,数据库中不存在的对象返回值为null,并且一但调用Get()方法,就会生成SQL语句


本节内容就讲解到这里了,谢谢欣赏,打工收工!

新浪微博粉丝精灵,刷粉丝、刷评论、刷转发、企业商家微博营销必备工具"

2011/9/7 2:22:59 | Nhibernate从入门到精通系列 | |

  • 发表评论