2008-09-24 2 views
3

nHibernate не может извлекать вручную измененные данные из таблицы репозитория? Я также отключил кеш второго уровня, но выглядит так (nhibernate) иногда извлекается из кеша, а иногда из таблицы репозитория.nHibernate не извлекает вручную измененные данные

+0

Не могли бы вы переписать заголовок вопроса, чтобы описать проблему более подробно, то есть что-то вроде «nHibernate не извлекает вручную измененные данные» – SCdF 2008-09-24 22:39:40

ответ

0

Я думаю, что вам нужно будет немного описать вашу точную проблему, чтобы получить ответ; У меня есть некоторый минимальный опыт работы с nhibernate, но я действительно не могу повторить то, что происходит, и попытаться исправить его, скажем, некий код.

0

Srry за то, что слишком специфичны

Nhibernate является получение данных без каких-либо проблем. Но когда я вручную изменяю данные в таблице репозитория. Icriterea (nhibernate) иногда извлекает из кеша или из таблицы. Я использую Icriteria funcnality:

ICriteria criteria = session.CreateCriteria (typeof (xyzclass)); criteria.Add (Expression.Eq ("xyzclass", somestringto retreivedata)); criteria.SetCacheable (false); критерии возврата.UniqueResult();

0

Я никогда не использовал функции кэширования NHibernate из первых рук, но я считаю, что цель этого заключается в том, чтобы удалить необходимость вообще обращаться к базе данных, то есть не будет получать ручные изменения, потому что это не так Не знаю о них.

Я бы точно спросил, что именно вы пытаетесь достичь здесь, вы просто выполняете некоторые тесты, вручную редактируя базу данных или это будет регулярная деятельность в реальном приложении? Действительно, единственное, что нужно модифицировать в вашей базе данных, - это приложение, которое делает это через ваш уровень данных NHibernate, чтобы обновлять и/или загрязнять кеш в этом процессе.

0

Это всего лишь часть тестирования.

Но в будущем мы могли бы вручную отредактировать данные. Я также установил lazy в false для этой таблицы и прокомментировал все свойства кеша второго уровня, используемые hibernate. Но даже тогда он возвращает мне разные значения вместо недавно измененного значения. Иногда это дает мне старое значение, а иногда и новое, поэтому оно не является постоянным.

1

Я не знаю, будет ли это решить проблему вы имеете, но документация гласит:

Чтобы полностью выселить все объекты из кэша сеанса, вызовите ISession.Clear()

Для кэша второго уровня существуют методы, определенные в ISessionFactory для вытеснения кэшированного состояния экземпляра, всего класса, экземпляра коллекции или всей коллекции.

Если вы делали это каждый раз, когда вы делали что-то, что выполняет SELECT, данные могут изменить вне диапазона, он должен делать то, что вы хотите.

6

Существует два типа кэшей в nhibernate: сеансовые кэши и кэши второго уровня. Кэш сеанса всегда кэширует объекты, просматриваемые этим сеансом, так как nhibernate знает, какие объекты были изменены и которые необходимо сохранить. Кэш второго уровня, который вы отключили, ниже этого. Информация, которую вы видите в кеше, поступает из кеша сеанса.

Если ваше приложение должно видеть изменения, сохраняемые другими источниками (скажем, ручные изменения в базе данных), ответ, вероятно, заключается в создании сеансов с более тонкой детализацией. Хотя SessionFactory живет на всю жизнь вашего приложения, объект Session должен создаваться гораздо чаще. Например, в веб-приложении каждый запрос генерирует свой собственный сеанс.

Если это не вариант, session.Clear() вытеснит все объекты из сеанса.

2

Хорошая связь с NHibernate всегда зависит от сильной приверженности OO и в большинстве распространенных случаев зависит от исключительности данных. Если у вас его нет, вы увидите некоторые неприятные проблемы и откажетесь от большинства хороших вещей, которые может предложить NH.

Допустим, что существует класс под названием «Foo», сопоставленный с таблицей «Foo» с столбцами «Id» и «SomeProperty». Если все строки имеют «SomeProperty», обновленные вручную от «oldValue» до «newValue», и NH отправляет некоторый запрос в DB, ​​запрашивающий все Foos, где SomeProperty = «newValue», DB возвращает все Foos, как и ожидалось. Но экземпляры Foo экземпляров NH могут иметь «oldValue», потому что Foo с возвращенным идентификатором уже был прикреплен к сеансу (другими словами, он был в кеше 1-го уровня).

Единственный короткий способ заставить NHibernate быть в курсе всех обновлений вручную, использует StatelessSesion, поэтому он не будет кэшировать экземпляры объектов и всегда будет предоставлять версию данных DB. Но если вы хотите применить это в транзакционной системе, это явный признак неуместного использования NH, и вы не получите большинство приятных функций NH.

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