Spring.Net HibernateTemplate.Execute Clarification - PullRequest
1 голос
/ 11 февраля 2012

Я принимаю проект, который был написан сторонними консультантами, которые уже ушли.

Я из 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

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

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

1 Ответ

2 голосов
/ 11 февраля 2012

Это то, что в весенних документах упоминается как Классическое использование Hibernate . Это не рекомендуемый в настоящее время подход к работе с NHibernate, который описан в главе об объектных реляционных преобразователях .

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

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

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

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

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

...