Да, вы правы, NH не получает сущности непосредственно из кэша ни для чего, кроме идентификатора. Обратите внимание, что все, кроме идентификатора, потенциально может измениться, и его нужно искать в базе данных.
Будьте осторожны при кэшировании. «Преждевременное кэширование - корень всего зла» или что-то в этом роде. Серьезно, если вы не уверены, что у вас есть заметные проблемы с производительностью, не пишите свой собственный кеш.
- Напишите код, который передает сущности в качестве аргументов, чтобы избежать загрузки одной и той же сущности несколько раз.
- Избегайте кэшей, которые живут дольше, чем сеанс. У вас будут устаревшие данные, если вы не уведомите обо всех изменениях.
- Избегайте статичных кэшей, используйте вместо них статический поток. Это позволяет избежать совместного использования данных между сеансами, что может нарушить изоляцию транзакции.
- Используйте кэши второго уровня, если вам это действительно нужно.
Если вы считаете, что у вас есть статический кеш, который живет до тех пор, пока приложение работает, я могу вам сказать, что вам лучше вообще его избегать. Он не будет работать должным образом при разумных усилиях.