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

В основном я смущен делегатом и почему делегат используется вместо простого запроса к базе данных. И в чем преимущество вышеупомянутого подхода.

Кроме того, я не вижу никакого nMibernate ORM-сопоставления xml. Требуется ли Spring.NET для сопоставления файлов для передачи данных из/в источник данных? Для слов, как ISession знает, к какой базе данных подключиться, и какую таблицу использовать и т. Д.

ответ

2

Это то, что весной документы относятся к как Classic Hibernate Usage. Это не рекомендованный в настоящее время подход к работе с NHibernate, который описан в chapter on object relational mappers.

«Удобное» использование делегатов здесь в основном выполняется, чтобы предоставить средства для управления сеансом и передать этот управляемый сеанс другим пользовательским методам (в данном конкретном случае - anonymous method). (Я думаю, что это реализация visitor pattern, кстати).

Используя этот подход, классический HibernateTemplate может предоставить функциональность методам, которые он «не знает», например, открытие и закрытие сессий правильно и участие в транзакциях.

Запрос фактически выполняется HibernateTemplate.Execute(myMethod); Я предполагаю, что он создает и инициализирует сеанс для вас, выполняет управление транзакциями, выполняет ваш метод с управляемым сеансом и очищает все.

Я никогда не использовал HibernateTemplate, но я уверен, что для этого потребуются файлы сопоставления и SessionFactory, поэтому, если этот код попадает во время выполнения и не генерирует никаких исключений, то конфигурация для них должна быть где-то там !

Что касается вопросов (помимо части делегата) в вашем опубликованном коде: использование NHibernateTemplate на самом деле не имеет к этому никакого отношения: вы можете просто запустить этот код в любом фрагменте кода, где вы у вас есть действительный экземпляр ISession:

+0

@Marjin, спасибо за вашу помощь. Как вы узнали Spring.net, есть ли книга, которую вы бы порекомендовали? Документация Spring.net предполагает, что читатель знает обратный вызов, делегирует вызовы и т. Д. Я ищу 101 с описанием. –

+0

Также, что является целью этого запроса IQuery query = hbSession.CreateQuery (queryText). другими словами, зачем ставить сеанс вместо прямого запроса db. Я не вижу преимущества хранения самого запроса в сеансе. –

+0

К сожалению, я не могу рекомендовать вам книгу на Spring.Net. Фактически, я узнал больше всего из документов, форума spring.net и исходного кода.Для общего понимания весеннего каркаса [Spring in Action] (http://www.manning.com/walls3/) - хорошая книга, но для Spring для Java. – Marijn

Смежные вопросы