本節将為您介紹介紹 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語句
本節内容就講解到這裡了,謝謝欣賞,打工收工!
-
編輯