2012-02-11 76 views
1

我接管了一個由已經離開的第三方顧問編寫的項目。Spring.Net HibernateTemplate.Execute澄清

我來自EF backgournd。其中一個DAO類有以下內容,我發現很難讓我的頭腦一步一步詳細解釋正在發生的事情。如果有人能夠幫助我理解這段代碼將非常感謝。

return HibernateTemplate.Execute(
        delegate(ISession hbSession) // <<--What is this code actually trying to do? 
        { 
         string queryText = "from {0} x where x.Code = :Code"; 
         queryText = string.Format(queryText, typeof(Product)); 

         IQuery query = hbSession.CreateQuery(queryText); 
         query.SetParameter("Code", productCode); 
         query.SetCacheable(true); 
         query.SetCacheRegion(CoreCacheConstants.ProductQueryCacheRegion); // <-- What is this code trying to do. 

         var fund = query.UniqueResult(); // <-- Is this similar to DISTINCT keyword in LINQ? 

         if (fund == null) 
          throw new ArgumentException(String.Format("No product found with productcode: {0}", productCode:)); 

         NHibernateUtil.Initialize(((Product)Product).Details); // <--What is this code trying to do. And where is the execute method for above queries. 
         return fund; 
        } 
       ) as Product 

基本上,我與委託部分混淆,爲什麼使用委託而不是簡單查詢數據庫。上述方法有什麼好處。

另外我不能看到任何nHibernate的ORM映射XML。 Spring.NET是否需要映射文件以將數據傳遞到數據源?爲了說明ISession如何知道要連接哪個數據庫以及要使用哪個表等

回答

2

這就是在spring文檔中提到的作爲Classic Hibernate Usage。目前並不推薦使用NHibernate,這在chapter on object relational mappers中有描述。

代理的「方便」使用基本上是爲了提供HibernateTemplate管理會話的方法,並將此管理會話轉交給其他自定義方法(在此特例中爲anonymous method)。 (我認爲這是visitor pattern的實現,順便說一句)。

使用這種方法,傳統的HibernateTemplate可以爲其「不知道」的方法提供功能,例如正確打開和關閉會話並參與事務。

查詢實際上是由HibernateTemplate.Execute(myMethod)執行;我想它會爲你創建和初始化一個會話,進行事務管理,用管理會話執行你的方法並清理所有事情。

我從來沒有用過HibernateTemplate,但我敢肯定它會需要映射文件和SessionFactory,所以如果這個代碼在執行過程中擊中並不會引發任何異常,對於那些配置必須是在某處!

關於您的發佈代碼中的問題(除代理部分外):NHibernateTemplate的使用與它沒有任何關係:您可以在代碼中的任何代碼運行此代碼已掌握有效的ISession實例:

+0

@Marjin,感謝你的幫助。你是如何學習Spring.net的,你會推薦哪本書? Spring.net文檔假設讀者知道回調,委託調用等。我正在尋找101描述。 – 2012-02-11 20:37:08

+0

另外,這個查詢的目的是什麼IQuery query = hbSession.CreateQuery(queryText)。換句話說,爲什麼要放在會話而不是直接查詢數據庫。我無法看到將查詢本身存儲在會話中的優勢。 – 2012-02-11 20:39:07

+0

不幸的是,我不能推薦你一本關於Spring.Net的書。其實,我從文檔,spring.net論壇和源代碼中學到了很多東西。對於Spring框架的一般理解,[Spring in Action](http://www.manning.com/walls3/)是一本很好的書,但它適用於Java的Spring。 – Marijn 2012-02-11 20:46:20