2012-02-24 41 views
1

背景:我們的項目團隊正在使用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響應而不填充類的對象。

我將非常感謝在這件事上的任何幫助。

回答

0

因此,經過多次嘗試後,我發現了這個問題。

上述初步分析是關鍵。代碼在動態映射模式下生成XML時,ehcache水合機制不起作用。解決問題的方法是創建一個支持hibernate映射的類文件。也就是說,當您使用名稱屬性指向類的hibernate映射(hbm.xml)文件時,一切都很好。 Hibernate可以爲類提供水分,然後以dom4j實體模式生成XML。

我在類標記中使用了enity-name屬性。我的代碼試圖直接提供XML。如上所示,這失敗了。

所以,我希望有人解決這個問題。

相關問題