您的位置:首页 > 其它

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

2012-09-06 08:49 337 查看
本节将为您介绍介绍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语句

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

-

编辑
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: