Hibernate L2 Caching для ассоциаций «многие к одному»

Я новичок в спящем режиме и пытаюсь реализовать кэширование второго уровня с помощью ehCache. Я столкнулся с проблемой при попытке использовать кеш L2 для получения ассоциации «многие к одному». Отображение ассоциации в моем файле foo.hbm.xml выглядит так:

<hibernate-mapping>
    <class name="com.test.Foo" table="FOO" >
        <id name="id" type="long">
            <column name="FOO_ID" precision="11" scale="0" />
            <generator class="assigned" />
        </id>

        <many-to-one name="bar" class="com.test.Bar" >
            <cache usage="read-only" />
            <column name="BAR_TY" not-null="true" />
            <column name="BAR_VAL" length="4" not-null="true" />
        </many-to-one>

    </class>
</hibernate-mapping>

(Это очень укороченная/модифицированная версия моего фактического файла hbm.xml, надеюсь, в нем нет ошибок)

Обратите внимание, что я кэширую только «bar», а не «foo». Однако, когда я запускаю модульный тест с этим сопоставлением, я получаю следующую ошибку:

СЕРЬЕЗНЫЙ: Ошибка синтаксического анализа XML: XML InputStream(40) Содержимое типа элемента "многие к одному" должно соответствовать "(мета*,(столбец|формула)*)".

Когда я вынимаю, он работает нормально, просто нет кэширования L2. Просто отношения «многие к одному» не поддерживают кэширование? И если да, то какие предложения, как это обойти?

К вашему сведению, у меня есть еще один модульный тест, который считывает «полосу» напрямую (т. е. не через ассоциацию), и он работает правильно — во второй раз, когда я получаю «полосу», она берется из кеша L2, поэтому я вполне уверен, что у меня есть остальные настройки сделаны правильно. А так извините, все еще в каменном веке на работе, поэтому никаких аннотаций и т. Д.


person Thomas Stoughton    schedule 01.06.2011    source источник


Ответы (2)


Пробовали ли вы переместить определение bar в другое, отдельное .hbm.xml и ссылаться на него только из foo?

person mindas    schedule 01.06.2011

Ваш XML имеет неверный формат. Это недопустимый узел <cache> внутри <many-to-one>.
См. hibernate-mapping- 3.0.дтд. Объявление элемента many-to-one:

<!ELEMENT many-to-one (meta*,(column|formula)*)>
    <!ATTLIST many-to-one name CDATA #REQUIRED>
    <!ATTLIST many-to-one access CDATA #IMPLIED>
    <!ATTLIST many-to-one class CDATA #IMPLIED>
    <!ATTLIST many-to-one entity-name CDATA #IMPLIED>
    <!ATTLIST many-to-one column CDATA #IMPLIED>
    <!ATTLIST many-to-one not-null (true|false) #IMPLIED>
    <!ATTLIST many-to-one unique (true|false) "false">
    <!ATTLIST many-to-one unique-key CDATA #IMPLIED>
    <!ATTLIST many-to-one index CDATA #IMPLIED>
    <!ATTLIST many-to-one cascade CDATA #IMPLIED>
    <!ATTLIST many-to-one outer-join (true|false|auto) #IMPLIED>
    <!ATTLIST many-to-one fetch (join|select) #IMPLIED>
    <!ATTLIST many-to-one update (true|false) "true">
    <!ATTLIST many-to-one insert (true|false) "true">
    <!ATTLIST many-to-one optimistic-lock (true|false) "true">  
    <!ATTLIST many-to-one foreign-key CDATA #IMPLIED>
    <!ATTLIST many-to-one property-ref CDATA #IMPLIED>
    <!ATTLIST many-to-one formula CDATA #IMPLIED>
    <!ATTLIST many-to-one lazy (false|proxy|no-proxy) #IMPLIED>
    <!ATTLIST many-to-one not-found (exception|ignore) "exception">
    <!ATTLIST many-to-one node CDATA #IMPLIED>
    <!ATTLIST many-to-one embed-xml (true|false) "true">  

Элемент кэша можно разместить на уровне класса:

<hibernate-mapping>
    <class name="com.test.Foo" table="FOO" >
        <cache usage="read-only" />
        <id name="id" type="long">

или для таких коллекций, как set, map, bag и т. д.

person Ilya    schedule 16.09.2014