Как заставить NHibernate ISession кэшировать объект, не полученный по первичному ключу

Моя сущность «пользователь» почти всегда извлекается по имени пользователя, а не по целочисленному суррогатному ключу. Поскольку имя пользователя не является первичным ключом, это означает, что ISession не будет его кэшировать и будет многократно обращаться к базе данных для получения одних и тех же данных.

Можно ли вообще настроить NHibernate, чтобы ISession кэшировала пользователей, извлекаемых по имени пользователя?


person David    schedule 04.03.2011    source источник


Ответы (3)


Кажется, ответ на самом деле нет. Да, если вы используете кеш второго уровня, нет, если вы используете кеш сеанса.

person David    schedule 04.03.2011
comment
Ответ на вопрос - нет, но проблема может быть решена с помощью ответа Серги Папасеита на этот вопрос: stackoverflow.com/questions/5272094/ - person David; 11.03.2011

Да, для этого вы можете использовать элемент natural-id NHibernate. См. http://ayende.com/Blog/archive/2009/06/23/nhibernate-ltnatural-idgt.aspx, пример именно то, что вы просите.

person Jamie Ide    schedule 04.03.2011
comment
На самом деле одного элемента natural-id недостаточно; вам нужно будет включить кэширование 2-го уровня. - person Frederik Gheysels; 04.03.2011
comment
Это то, чего я боялся. Я не хочу использовать кеш второго уровня. Я использую Session-Per-Request и не хочу, чтобы кэшированные элементы длились дольше. Я думаю, что ответ на мой вопрос - нет. - person David; 04.03.2011

«Кэш сеанса» на самом деле не кеш, а карта сущностей.

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

person Diego Mijelshon    schedule 05.03.2011
comment
В каком смысле это не кеш? Он хранит объекты, загруженные из базы данных, и устраняет необходимость их последующей загрузки из базы данных. Это тайник, откуда я! Спасибо за ваше предложение о поставщике кэша на основе HttpContext. - person David; 07.03.2011