Использование вторичного кэша nHibernate для ссылки «многие к одному» - PullRequest
0 голосов
/ 10 февраля 2012

Я пытаюсь заставить 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>

1 Ответ

0 голосов
/ 16 февраля 2012

Мне кажется, я ответил на свои вопросы. 1) Для предварительной загрузки всей коллекции мне просто нужно было изменить свой код так, чтобы весь список поисков всегда извлекался из БД и кэшировался, затем я получаю отдельный объект по ID с помощью LINQ. 2) То же, что и раньше. 3) Я еще не проверял это, но мне нужно удалить fetch = "join" из элемента многие-к-одному, потому что в противном случае соединение SQL все равно будет сгенерировано и данные все равно будут возвращены. Затем установите объект поиска без nHibernate, получив его из кэша.

...