Работает ли Hibernate Query Cache в режиме Dom4J - PullRequest
1 голос
/ 24 февраля 2012

Справочная информация : наша команда проекта использует режим объекта Hibernate dom4j для генерации ответов SOAP для нескольких клиентских приложений. Объем доставляемых данных огромен, и время ответа является проблемой. Мы можем значительно сократить количество вызовов SQL, используя Hibernate Query Cache и / или кэш 2-го уровня. Из-за архитектуры нашей системы механизм уровня кэширования 1-го уровня не будет улучшать производительность, как работает кэширование запросов в SessionFactory.

Вопрос : Основной вопрос заключается в том, совместим ли режим Entity DOM4J Hibernate с кешированием запросов. Результаты запроса помещаются в кэш запросов. Однако при выполнении метода query.list() и обнаружении соответствующего кэшированного запроса выдается следующее исключение:

Вызывается :

java.lang.ClassCastException: org.dom4j.tree.DefaultElement cannot be cast to java.math.BigDecimal
      at org.hibernate.type.descriptor.java.BigDecimalTypeDescriptor.extractHashCode(BigDecimalTypeDescriptor.java:36)
      at org.hibernate.type.AbstractStandardBasicType.getHashCode(AbstractStandardBasicType.java:197)
      at org.hibernate.type.AbstractStandardBasicType.getHashCode(AbstractStandardBasicType.java:192)
      at org.hibernate.engine.EntityKey.generateHashCode(EntityKey.java:126)
      at org.hibernate.engine.EntityKey.<init>(EntityKey.java:70)
      at org.hibernate.type.ManyToOneType.scheduleBatchLoadIfNeeded(ManyToOneType.java:160)
      at org.hibernate.type.ManyToOneType.beforeAssemble(ManyToOneType.java:246)
      at org.hibernate.cache.StandardQueryCache.get(StandardQueryCache.java:143)
      at org.hibernate.loader.Loader.getResultFromQueryCache(Loader.java:2361)
      at org.hibernate.loader.Loader.listUsingQueryCache(Loader.java:2309)
      at org.hibernate.loader.Loader.list(Loader.java:2268)
      at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:452)
      at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:363)
      at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:196)
      at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1268)
      at org.hibernate.impl.QueryImpl.list(QueryImpl.java:102)

Нашей средой является Core-Spring / Hibernate ...

В нашей фабричной конфигурации Spring-Hibernate используется следующая конфигурация:

<prop key= "hibernate.cache.provider_class">net.sf.ehcache.hibernate.EhCacheProvider</prop>
<prop key= "hibernate.cache.region.factory_class"> net.sf.ehcache.hibernate.EhCacheRegionFactory</prop>
<prop key="hibernate.cache.query.factory_class"> org.hibernate.cache.StandardQueryCacheFactory</prop>
<prop key="hibernate.cache.use_second_level_cache">true</prop>
<prop key="hibernate.cache.use_query_cache">true</prop>
<prop key="hibernate.generate_statistics">true</prop>
<prop key="hibernate.cache.use_structured_entries">true</prop>

Первоначальный анализ : Мне кажется, что «экспериментальный» режим сущности DOM4J в Hibernate не совместим с Query и Entity Cache. Также важно отметить, что в наших файлах отображения hibernate hbm.xml используется динамическое отображение. То есть файлы сопоставления не имеют ссылок на классы; вместо этого у них есть ссылки на сущности. Таким образом, ответы XML генерируются напрямую, без заполнения объектов класса.

Буду очень признателен за любую помощь в этом вопросе.

1 Ответ

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

Итак, после многих попыток я обнаружил проблему.

Первоначальный анализ был ключевым.Механизм гидратации ehcache не работает, когда код генерирует XML в режиме динамического отображения.Решением этой проблемы было создание файла класса для поддержки отображения гибернации.То есть, когда вы используете файл отображения гибернации (hbm.xml) с атрибутом name, указывающим на класс, тогда все в порядке.Hibernate может увлажнять класс, а затем генерировать XML в режиме сущности dom4j.

Я использовал атрибут enity-name в теге класса.Мой код пытался увлажнить XML напрямую.Это не удалось, как показано выше.

Итак, я надеюсь, что это решение кто-то когда-нибудь.

...