本节将为您介绍介绍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语句
本节内容就讲解到这里了,谢谢欣赏,打工收工!