背景:私たちのプロジェクトチームは、Hibernateのdom4jエンティティモードを使用して複数のクライアントアプリケーションのSOAP応答を生成しています。配信されるデータの量は膨大であり、応答時間が問題になります。 Hibernate Query Cacheおよび/または2nd Level Cacheを使用することで、SQLコールの数を大幅に削減できます。システムのアーキテクチャにより、第1レベルキャッシュ(セッション)レベルのメカニズムは、SessionFactoryでのクエリキャッシュが機能するようにパフォーマンスを改善しません。Hibernate Query Cacheは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は...
です私たちの春 - 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マッピングファイルに注意することも重要です。つまり、マッピングファイルにはクラス参照がありません。代わりに実体参照があります。したがって、XML応答は、クラスのオブジェクトを生成することなく直接生成されます。
私はこの件に関していかなる援助にも大変感謝しています。