Справочная информация : наша команда проекта использует режим объекта 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 генерируются напрямую, без заполнения объектов класса.
Буду очень признателен за любую помощь в этом вопросе.