日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

NHibernate 状态的概念 以及 小测试

發(fā)布時(shí)間:2025/6/17 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 NHibernate 状态的概念 以及 小测试 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在?NHibernate中有三種狀態(tài)。

?

  • 臨時(shí)態(tài)(Transient):用new創(chuàng)建的對(duì)象,它沒有持久化,沒有納入Session中,隨時(shí)可以被垃圾回收,處于此狀態(tài)的對(duì)象叫臨時(shí)對(duì)象。特點(diǎn):數(shù)據(jù)庫中沒有與之對(duì)應(yīng)的記錄;
  • 持久態(tài)(Persistent):已經(jīng)持久化,加入到了Session緩存中。通過NHibernate保存的對(duì)象或通過Get/Load等方法獲取出的對(duì)象,其對(duì)象沒有脫離Session的管理,處于此狀態(tài)的對(duì)象叫持久對(duì)象;
  • 游離態(tài)(Detached):持久化對(duì)象脫離了Session的對(duì)象。如Session緩存被清空的對(duì)象。特點(diǎn):已經(jīng)持久化,但不在Session緩存中。處于此狀態(tài)的對(duì)象叫游離對(duì)象;

?

?

?臨時(shí)態(tài)(Transient)到持久態(tài)(Persistent)

?

先new一個(gè)對(duì)象,該對(duì)象的狀態(tài)為Transient,然后調(diào)用Save()方法將該對(duì)象持久化到數(shù)據(jù)庫中,該對(duì)象的狀態(tài)變?yōu)镻ersistent。在未關(guān)閉Session前,修改該對(duì)象的屬性,最后提交事務(wù)。

?

1 /// <summary> 2 /// 臨時(shí)態(tài)-->持久態(tài) 3 /// </summary> 4 [Test] 5 public void TransientToPersistentTest() 6 { 7 using (ISession session = this.sessionFactory.OpenSession()) 8 { 9 using (ITransaction tran = session.BeginTransaction()) 10 { 11 //Transient 12 var product = new Product 13 { 14 ID = Guid.NewGuid(), 15 BuyPrice = 10M, 16 Code = "ABC123", 17 Name = "電腦", 18 QuantityPerUnit = "20x1", 19 SellPrice = 11M, 20 Unit = "臺(tái)" 21 22 }; 23 24 try 25 { 26 //Persistent 27 session.Save(product); 28 29 //保存記錄后修改數(shù)據(jù),觀察數(shù)據(jù)庫中數(shù)據(jù)的變化 30 product.SellPrice = 12M; 31 32 tran.Commit(); 33 } 34 catch (Exception ex) 35 { 36 tran.Rollback(); 37 throw ex; 38 } 39 } 40 } 41 }

?

這時(shí),我們心里便產(chǎn)生了一個(gè)疑問:把Product的SellPrice屬性從“11M”修改為“12M”后,并沒有調(diào)用Save()或者Update()的方法,為什么數(shù)據(jù)庫中的數(shù)據(jù)會(huì)變呢?

  這是因?yàn)?#xff0c;當(dāng)對(duì)象處于Persistent狀態(tài),并沒有脫離Session管理時(shí),其屬性發(fā)生改變后,數(shù)據(jù)庫相對(duì)應(yīng)的記錄會(huì)與之同步

?

?

?

持久態(tài)(Persistent)到游離態(tài)(Detached),再到持久態(tài)(Persistent)

?

1 /// <summary> 2 /// 持久態(tài)-->游離態(tài)-->持久態(tài) 3 /// </summary> 4 [Test] 5 public void PersistentToTestDetached() 6 { 7 //Transient 8 var product = new Product 9 { 10 ID = Guid.NewGuid(), 11 BuyPrice = 10M, 12 Code = "ABC123", 13 Name = "電腦", 14 QuantityPerUnit = "20x1", 15 SellPrice = 11M, 16 Unit = "臺(tái)" 17 }; 18 19 using (ISession session = this.sessionFactory.OpenSession()) 20 { 21 using (ITransaction tran = session.BeginTransaction()) 22 { 23 try 24 { 25 //Persistent 26 session.Save(product); 27 product.SellPrice = 12M; 28 29 tran.Commit(); 30 } 31 catch (Exception ex) 32 { 33 tran.Rollback(); 34 throw ex; 35 } 36 } 37 } 38 39 //Detached 40 product.SellPrice = 13M; 41 42 using (ISession session = this.sessionFactory.OpenSession()) 43 { 44 using (ITransaction tran = session.BeginTransaction()) 45 { 46 try 47 { 48 //Persistent 49 session.Update(product); 50 tran.Commit(); 51 } 52 catch (Exception ex) 53 { 54 tran.Rollback(); 55 throw ex; 56 } 57 } 58 } 59 }

?

?

?

當(dāng)對(duì)象處于游離態(tài)(Detached)時(shí),修改其屬性,是不會(huì)與數(shù)據(jù)庫發(fā)生同步的。調(diào)用Update()方法后,對(duì)象則變回持久態(tài)(Persistent)。

?

Get方法得到持久態(tài)(Persistent)

?

1 [Test] 2 public void PersistentToTestDetached() 3 { 4 //Transient 5 string ID1 = Guid.NewGuid().ToString(); 6 var product = new Product 7 { 8 ID = ID1, 9 BuyPrice = 10M, 10 Code = "ABC123", 11 Name = "電腦", 12 QuantityPerUnit = "20x1", 13 SellPrice = 11M, 14 Unit = "臺(tái)" 15 }; 16 17 using (ISession session = this.sessionFactory.OpenSession()) 18 { 19 using (ITransaction tran = session.BeginTransaction()) 20 { 21 try 22 { 23 //Persistent 24 session.Save(product); 25 product.SellPrice = 12M; 26 27 tran.Commit(); 28 } 29 catch (Exception ex) 30 { 31 tran.Rollback(); 32 throw ex; 33 } 34 } 35 } 36 37 //Detached 38 39 40 using (ISession session = this.sessionFactory.OpenSession()) 41 { 42 using (ITransaction tran = session.BeginTransaction()) 43 { 44 try 45 { 46 //Persistent 47 product=session.Get<Product>(ID1);//Get可與Load互換 48 product.SellPrice = 18M; 49 tran.Commit(); 50 } 51 catch (Exception ex) 52 { 53 tran.Rollback(); 54 throw ex; 55 } 56 } 57 } 58 }

?

其中ID1為數(shù)據(jù)庫中已存在的一條數(shù)據(jù)的主鍵值。在得到持久化對(duì)象后,我們便可以更改數(shù)據(jù)庫的值。

?

?

?

?Get和Load()方法的區(qū)別

?

Load:

  • Load方法可以對(duì)查詢進(jìn)行優(yōu)化。
  • Load方法實(shí)際得到一proxy對(duì)象,并不立即查詢數(shù)據(jù)庫。當(dāng)訪問對(duì)象的屬性的時(shí)候才查詢數(shù)據(jù)庫。在NHibernate里稱為Lazy Loding(延遲加載)。
  • Load方法得到的對(duì)象,如果對(duì)象不存在,在訪問對(duì)象的屬性時(shí)將拋出異常。
  • 當(dāng)需要得到實(shí)體對(duì)象,但是不需要訪問對(duì)象屬性的時(shí)候,宜使用Load方法。比如Delete方法:

? ?調(diào)用Load()方法查詢數(shù)據(jù)庫中不存在的對(duì)象,返回值不為空;當(dāng)調(diào)用Load()方法時(shí),不立刻產(chǎn)生SQL語句,查看其屬性后才產(chǎn)生SQL語句,并且查看數(shù)據(jù)庫中不存在對(duì)象的屬性時(shí)會(huì)拋出異常。原因是調(diào)用Load()方法會(huì)返回一個(gè)“代理類”,這是NHibernate的一個(gè)重要的特性——延遲加載。

 延遲加載(lazy load)也叫“懶加載”,是NHibernate關(guān)聯(lián)關(guān)系對(duì)象默認(rèn)的加載方式,延遲加載機(jī)制是為了避免一些無謂的性能開銷而提出來的,所謂延遲加載就是當(dāng)在真正需要數(shù)據(jù)的時(shí)候,才真正執(zhí)行數(shù)據(jù)加載操作。可以簡單理解為,只有在使用的時(shí)候,才會(huì)發(fā)出SQL語句進(jìn)行查詢。 延遲加載的有效期是在Session打開的情況下,當(dāng)Session關(guān)閉后,會(huì)報(bào)異常。NHibernate的代理對(duì)象是由第三方組件“Antlr3.Runtime”提供的。

?

?

?

Get:

  • Get方法立即查詢數(shù)據(jù)庫,如果對(duì)象不存在,返回null。
  • 調(diào)用Get()方法后,數(shù)據(jù)庫中不存在的對(duì)象返回值為null,并且一但調(diào)用Get()方法,就會(huì)生成SQL語句。

?

?

?

?

?

Update()方法

?

先手動(dòng)打造new一個(gè)數(shù)據(jù)庫中存在的游離態(tài)(Detached)對(duì)象,然后直接調(diào)用Update()方法將對(duì)象的狀態(tài)設(shè)置為持久態(tài)(Persistent)。

?

1 [Test] 2 public void UpdateTest() 3 { 4 Guid id = Guid.NewGuid(); 5 6 using (ISession session = this.sessionFactory.OpenSession()) 7 { 8 using (ITransaction tran = session.BeginTransaction()) 9 { 10 //Transient 11 var product = new Product 12 { 13 ID = id, 14 BuyPrice = 10M, 15 Code = "ABC123", 16 Name = "電腦", 17 QuantityPerUnit = "20x1", 18 SellPrice = 11M, 19 Unit = "臺(tái)" 20 21 }; 22 23 try 24 { 25 //Persistent 26 session.Save(product); 27 tran.Commit(); 28 } 29 catch (Exception ex) 30 { 31 tran.Rollback(); 32 throw ex; 33 } 34 } 35 } 36 37 using (ISession session = this.sessionFactory.OpenSession()) 38 { 39 using (ITransaction tran = session.BeginTransaction()) 40 { 41 //Detached 42 var product = new Product 43 { 44 ID = id, 45 Code = "ABC456", 46 }; 47 48 try 49 { 50 //Persistent 51 session.Update(product); 52 53 tran.Commit(); 54 } 55 catch (Exception ex) 56 { 57 tran.Rollback(); 58 throw ex; 59 } 60 } 61 } 62 }

?

有的朋友就會(huì)問,為什么new的時(shí)候也能得到游離態(tài)(Detached)對(duì)象?因?yàn)榕袛嗍欠駷?strong>游離態(tài)(Detached)對(duì)象,是根據(jù)數(shù)據(jù)庫中是否存在與之對(duì)應(yīng)的記錄定奪的。

?

?Delete()方法

?

?

先得到一個(gè)持久態(tài)(Persistent)對(duì)象,然后調(diào)用Delete()方法刪除該對(duì)象,這時(shí)該對(duì)象變回臨時(shí)態(tài)(Transient)

?

1 [Test] 2 public void DeleteTest() 3 { 4 using (ISession session = this.sessionFactory.OpenSession()) 5 { 6 using (ITransaction tran = session.BeginTransaction()) 7 { 8 //Transient 9 var product = new Product 10 { 11 ID = Guid.NewGuid(), 12 BuyPrice = 10M, 13 Code = "ABC123", 14 Name = "電腦", 15 QuantityPerUnit = "20x1", 16 SellPrice = 11M, 17 Unit = "臺(tái)" 18 19 }; 20 21 try 22 { 23 //Persistent 24 session.Save(product); 25 26 //Transient 27 session.Delete(product); 28 29 tran.Commit(); 30 } 31 catch (Exception ex) 32 { 33 tran.Rollback(); 34 throw ex; 35 } 36 } 37 } 38 }

?

?

?

?

?

學(xué)習(xí)于? ? ??http://www.cnblogs.com/GoodHelper/archive/2011/02/17/nhibernate_04.html

轉(zhuǎn)載于:https://www.cnblogs.com/cwmizlp/p/9208291.html

總結(jié)

以上是生活随笔為你收集整理的NHibernate 状态的概念 以及 小测试的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。