Кэш второго уровня
Взгляните на http://ayende.com/Blog/archive/2006/07/24/DeepDivingIntoNHibernateTheSecondLevelCache.aspx и http://www.javalobby.org/java/forums/t48846.html
Из первого:
Кэш второго уровня делаетне для хранения сущностей, а для наборов значений
Таким образом, при правильной настройке кэширования NHibernate сможет воссоздать ваш объект без необходимости получать фактические значения из базы данных.Другими словами, объект будет создан так же, как когда его не было в кэше, за исключением того, что, поскольку значения кэшируются, NHibernate фактически не будет запрашивать базу данных, поскольку он уже знает, что там находится.
Я не совсем уверен, что вы подразумеваете под "проверкой" и "найден по ошибке".Вы проверяете перед вставкой?Как правило, мои сущности проверяются перед вставкой / обновлением и фактически не будут вставлены / обновлены, если недействительны.
Помимо проверки, я думаю, что вы спрашиваете, что если вы:
- сохранить что-то
- сделать сброс
- получить элемент (из нового сеанса) с тем же ключом, который был сохранен на шаге 1
.получать ту же ссылку на объект, который вы сохранили на шаге 1 (?).И ответ - нет, поскольку NHibernate не кэширует ОБЪЕКТ, а скорее значения, чтобы он мог создать новую сущность, заполненную кэшированными значениями (вместо фактического выполнения запроса к БД).
Однако действительно ли это имеет значение?Если вы перегружаете «Равные» так, что равенство 2 сущностей основано на их идентификаторе, то поиск одного и того же (не ссылочного, но одинакового) элемента в сетке (или любого хэша) должен быть простым.
Кэш первого уровня
Я не знал, что вы говорите о кеше 1-го уровня.Кэш 1-го уровня работает как карта идентичности и кеширует экземпляр объекта.Поэтому, если вы сделаете 2 выбора из БД на основе одного и того же идентификатора, вы получите тот же экземпляр объекта.