Hibernate L2 Кэширование для многозначных ассоциаций
Я немного новичок в спящем режиме и пытаюсь реализовать кэширование второго уровня с помощью 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". Однако, когда я запускаю модульный тест с этим отображением, я получаю следующую ошибку:
SEVERE: Ошибка синтаксического анализа XML: XML InputStream(40) Содержимое типа элемента "многие-к-одному" должно соответствовать "(meta*,(column| формула)*)".
Когда вынимаю, все работает нормально, просто нет L2 кеширования. Просто отношения "многие к одному" не поддерживают кеширование? И если да, какие-либо предложения о том, как обойти это?
К вашему сведению, у меня есть еще один модульный тест, который читает "bar" напрямую (т.е. не через ассоциацию), и он работает правильно - во 2-й раз, когда я получаю "bar", он получает его из кэша L2, так что я довольно уверен, что у меня есть Остальная конфигурация выполнена правильно. И так извините, все еще в каменном возрасте на работе, поэтому никаких аннотаций и т. Д.
2 ответа
Вы пробовали двигать определение bar
в другое, отдельный .hbm.xml
и только ссылаясь на него из foo
?
Ваш XML поврежден. Это незаконный узел <cache>
внутри <many-to-one>
,
Смотрите http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd. Декларация о 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
и т.п.