2012-02-11 38 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