2012-02-09 1 views
0

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

ответ

0

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