Я пытаюсь заставить nHibernate использовать кэш второго уровня с отношением многие-к-одному, однако я не могу найти четкого объяснения того, как правильно его настроить. Я нашел это Как получить nhibernate для кэширования таблиц, на которые ссылаются через многие-к-одному - мой конфиг корректен? , но приведенный пример sJHonny для одного ко многим, и он не работает для меня, когда я принять это. Есть другие сообщения, посвященные этой теме, но ни один из них не является достаточно конкретным.
Конфигурация XML, которую я предоставляю, работает (мне пришлось драматически редактировать, поэтому «мы надеемся» работает), но объекты поиска кэшируются только тогда, когда они извлекаются при запросе DataObject. Я хотел бы знать 1) где / как предварительно загрузить коллекцию LookupObject? 2) что если я назначу эту коллекцию региону и установлю срок действия, то где / как мне снова перезагрузить кэш? 3) как изменить hbm.xml в DataObject таким образом, чтобы nHibernate не генерировал соединение с таблицей LOOKUP, т.е. чтобы объекты поиска всегда поступали из вторичного кэша, получая только DATA.LOOKUP_ID из БД, а не LOOKUP. NAME
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>