天天看點

NHibernate生命周期:臨時态、持久态、遊離态-NHibernate入門到精通系列4

本節将為您介紹介紹 NHibernate生命周期 的三種狀态:臨時态、持久态、遊離态。

了解好 NHibernate生命周期 的三種狀态,将有助于你更好的深入開發,下面進行介紹:

1:臨時态,英文名稱:Transient

臨時态故名思義就是臨時的,它随時将被垃圾回收,而且對資料庫沒有對應關系。

使用new來建立對象,非持久化,不存入Session。

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

已持久化,存入Session,所儲存的對象通過GET或Load方法或擷取對象。

3:遊離态,英文名稱: Detached

已持久化,但已被清除出Session,處于遊離失散狀态。

臨時态、持久态、遊離态三種狀态,在生命周期中可以互相轉換,如下圖所示:

NHibernate生命周期:臨時态、持久态、遊離态-NHibernate入門到精通系列4

下面我們使用簡單的示例來示範一下NHibernate生命周期的三種狀态:臨時态、持久态、遊離态。

按上節内容 基礎增删改查-NHibernate入門到精通系列3 ,準備好項目:

如下圖:

NHibernate生命周期:臨時态、持久态、遊離态-NHibernate入門到精通系列4

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;

                    }

                }

            }

        }

最終結果如圖:

NHibernate生命周期:臨時态、持久态、遊離态-NHibernate入門到精通系列4

說明:當對象處于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;

                    }

                }

            }

        }

最終結果如圖:

NHibernate生命周期:臨時态、持久态、遊離态-NHibernate入門到精通系列4

補充1:當對象處于遊離态(Detached)時,修改其屬性,是不會與資料庫發生同步的。調用Update()方法後,對象則變回持久态(Persistent)。

補充2:通過Get()方法,是可以得到持久态(Persistent)對象的

補充 3:調用Get()方法後,資料庫中不存在的對象傳回值為null,并且一但調用Get()方法,就會生成SQL語句

本節内容就講解到這裡了,謝謝欣賞,打工收工!

-

編輯