2012-03-12 14 views
1

私はHQLクエリを持ってHibernateは、フェッチ、HQLとhashCode()

SELECT myclass 
FROM 
    MyClass myclass JOIN FETCH 
    myclass.anotherset sub JOIN FETCH 
    sub.yetanotherset 
... 

「ALA何かがそう、クラスMyClassのは、別のクラスのインスタンスを含むセットであるプロパティ "anotherset" を、持っている、通話をすることができますそれはMyClassTwo。また、クラスMyClassTwoには、他のクラスの第3のタイプのセットであるその他のプロパティがあります(それ以上の関連付けはありません)。

このシナリオでは、hashCode実装に問題があります。基本的には、MyClassTwoのhashCode実装は "yetanotherset"プロパティを使用し、それはyetanothertestプロパティにアクセスする正確な行ではLazyInitializationExceptionで失敗します。 「yetanotherset」からのデータがまだフェッチされていないので、私は推測している

org.hibernate.LazyInitializationException: illegal access to loading collection 

が、これはですが、私はこれをどのように解決するのですか?私は特に、プロパティを無視するためにhashCodeをダンピングするという考えは好きではありません。

追加の質問は、HQLはXMLまたはアノテーションで定義されているfetch = FetchType.EAGERを無視しますか?しかし、私はどこでもこれを確認できません。

答えて

5

hashCode()可変フィールドを使用して実装することは悪い考えです。つまり、エンティティをHashSetに格納し、変更可能なプロパティを変更できなくなります。

他のエンティティのコレクションに関して実装することはさらに悪い考えです。つまり、コレクションの読み込みを強制してhashCodeを計算します。

エンティティで一意で不変なプロパティ(またはプロパティのセット)を選択し、それに基づいてhashCodeを実装します。最後の手段として、IDを使用するオプションがありますが、自動生成されている場合は、IDが生成される前にセットに入れないでください。

1

これは休止状態の最も有名な例外です。これはあなたの説明とまったく同じです。セッションが切断され、トランザクションが閉じられ、このコレクションにアクセスしようとしています。 HQLのJOIN FETCHは、アノテーションが存在するかどうかにかかわらず、EAGERのロードを強制する必要があります。

あなたの注釈の形式が間違っているか、期限が切れているか期限が切れているか、その種類のその他の問題があると思われます。

HibernateログレベルをバンプしてSQL hibernate.SQL=debugを生成し、この例外が表示される場所まで実行されているSQLを正確に調べてください。これは、あなたの休止状態の設定があなたが設定したと思うように動作しているかどうかを示すはずです。

あなたのコードとログをさらに投稿すれば、誰かがエラーを発見するのに役立つかもしれません。

関連する問題