2012-02-24 11 views
1

背景:私たちのプロジェクトチームは、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応答は、クラスのオブジェクトを生成することなく直接生成されます。

私はこの件に関していかなる援助にも大変感謝しています。

答えて

0

多くの試行の後、私は問題を発見しました。

上記の初期分析が重要でした。コードがXMLを動的マッピングモードで生成したとき、ehcacheの水和メカニズムは機能しません。この問題を解決する解決策は、ハイバーネイトマッピングをサポートするクラスファイルを作成することでした。つまり、クラスを指すname属性を持つhibernateマッピング(hbm.xml)ファイルを使用すると、すべてがうまくいきます。 Hibernateはクラスを水和させ、次にdom4jエンティティモードでXMLを生成することができます。

私はclassタグでenity-name属性を使用していました。私のコードはXMLを直接水和することを試みていました。これは上記のように失敗しました。

だから、私はこの解決策を誰かが願っています。

関連する問題