Я пытаюсь заставить nHibernate использовать кеш второго уровня со многими отношениями «один-один», однако я не могу найти четкого объяснения того, как установить это правильно. Я нашел это How to get nhibernate to cache tables referenced via many-to-one - is my config correct?, но пример sJHonny предоставлен для одного-ко-многим, и он не работает для меня, когда я его принимаю. По этому вопросу есть другие сообщения, но ни один из них не является достаточно конкретным.Использование вторичного кеша nHibernate для ссылки «много-в-один»
Конфигурация XML, которую я предоставляю (мне пришлось редактировать значительно, так что «надеюсь» работает), но объекты поиска кэшируются только тогда, когда они извлекаются при запросе DataObject. Я хотел бы знать 1) где/как предварительно загрузить коллекцию LookupObject? 2) что, если я назначу эту коллекцию региону и задаю истечение срока, тогда где/как перезагрузить кеш? 3) как изменить файл hbm.xml DataObject таким образом, чтобы nHibernate не создавал соединение с таблицей LOOKUP, т. Е. Такие, что объекты поиска всегда поступают из вторичного кеша, только получая DATA.LOOKUP_ID из db, а не из LOOKUP. ИМЯ?
LookupObject.hbm.xml
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="BusinessObjects" assembly="BusinessObjects">
<class name="LookupObject" table="LOOKUP" mutable="false" batch-size="20">
<cache usage="read-only" />
<id name="Id" column="ID" />
<property name="Name" column="NAME" />
</class>
</hibernate-mapping>
DataObject.hbm.xml
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="BusinessObjects" assembly="BusinessObjects">
<class name="DataObject"
table="DATA" mutable="false">
<composite-id>
<key-property name="Id" column="ID"/>
<key-property name="Date" column="DATE" type="Date"/>
</composite-id>
<many-to-one name="LookupObject" not-null="true" column="LOOKUP_ID" fetch="join">
</class>
</hibernate-mapping>