NHibernate: Если два вызова сделаны для CreateCriteria, из какого списка Get <T>собирается извлечь объект? - PullRequest
1 голос
/ 09 февраля 2010

В рамках одного UnitOfWork (сеанса) я могу дважды вызвать CreateCriteria. Мой первый вызов - заполнить сетку для редактирования данных. Допустим, данные были отредактированы и сброшены (сохранены) в базу данных , а сетка все еще открыта. После того, как данные отредактированы, я могу во второй раз вызвать CreateCriteria для получения списка объектов, которые были проверены и найдены с ошибкой.

Позволяет сказать, что ObjectA был получен при обоих вызовах session.CreateCriteria. Он был отредактирован в сетке, но обнаружил ошибку во втором списке.

Первый вопрос будет таким: Учитывая кэш первого уровня, является ли ObjectA - который был получен из второго вызова CreateCriteri - представителем, полученным из первого вызова? или, что еще лучше, NHibernate «обнаружил и повторно использовал» ObjectA при первом вызове, предполагая, что ключи не изменились?

К моему последнему вопросу: я хочу отредактировать ObjectA, который был найден по ошибке, и, скажем, он был выведен в ListBox. Поэтому я хочу выделить этот объект, вызвать метод session.Get () (ключ), чтобы извлечь его из кэша, а затем вызвать форму изменения, чтобы изменить свойства ObjectA. Какой объект я меняю? Один из первого вызова CreateCriteria или второй вызов? Они одинаковые?

Заранее спасибо.

1 Ответ

1 голос
/ 10 февраля 2010

Кэш второго уровня

Взгляните на http://ayende.com/Blog/archive/2006/07/24/DeepDivingIntoNHibernateTheSecondLevelCache.aspx и http://www.javalobby.org/java/forums/t48846.html

Из первого:

Кэш второго уровня делаетне для хранения сущностей, а для наборов значений

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

Я не совсем уверен, что вы подразумеваете под "проверкой" и "найден по ошибке".Вы проверяете перед вставкой?Как правило, мои сущности проверяются перед вставкой / обновлением и фактически не будут вставлены / обновлены, если недействительны.

Помимо проверки, я думаю, что вы спрашиваете, что если вы:

  1. сохранить что-то
  2. сделать сброс
  3. получить элемент (из нового сеанса) с тем же ключом, который был сохранен на шаге 1

.получать ту же ссылку на объект, который вы сохранили на шаге 1 (?).И ответ - нет, поскольку NHibernate не кэширует ОБЪЕКТ, а скорее значения, чтобы он мог создать новую сущность, заполненную кэшированными значениями (вместо фактического выполнения запроса к БД).

Однако действительно ли это имеет значение?Если вы перегружаете «Равные» так, что равенство 2 сущностей основано на их идентификаторе, то поиск одного и того же (не ссылочного, но одинакового) элемента в сетке (или любого хэша) должен быть простым.


Кэш первого уровня

Я не знал, что вы говорите о кеше 1-го уровня.Кэш 1-го уровня работает как карта идентичности и кеширует экземпляр объекта.Поэтому, если вы сделаете 2 выбора из БД на основе одного и того же идентификатора, вы получите тот же экземпляр объекта.

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