nHibernate не получает вручную измененные данные - PullRequest
4 голосов
/ 25 сентября 2008

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

Ответы [ 7 ]

6 голосов
/ 02 октября 2008

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

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

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

2 голосов
/ 24 ноября 2010

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

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

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

1 голос
/ 26 сентября 2008

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

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

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

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

0 голосов
/ 25 сентября 2008

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

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

0 голосов
/ 25 сентября 2008

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

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

0 голосов
/ 25 сентября 2008

Извините за слишком конкретную информацию

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

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

0 голосов
/ 25 сентября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...