背景:我們的項目團隊正在使用Hibernate的dom4j實體模式爲多個客戶端應用程序生成SOAP響應。正在交付的數據量很大,響應時間也是一個問題。我們可以通過使用Hibernate Query Cache和/或2nd Level Cache來顯着減少SQL調用的次數。由於我們系統的體系結構,第一級緩存(會話)級別的機制不會像SessionFactory的查詢緩存那樣提高性能。Hibernate查詢緩存是否以Dom4J模式工作
問題:潛在的問題是Hibernate的DOM4J實體模式是否與查詢緩存兼容。查詢結果正被放入查詢緩存中。然而,當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)
我們的環境爲核心,春/休眠...
在我們的春天Hibernate的Session的出廠配置,配置用來:
<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>
初始分析:我的直覺是Hibernate的「實驗性」DOM4J實體模式與查詢和實體緩存不兼容。注意到我們的Hibernate hbm.xml映射文件使用動態映射也很重要。也就是說,映射文件沒有Class引用;相反,他們有實體引用。因此,直接生成XML響應而不填充類的對象。
我將非常感謝在這件事上的任何幫助。