2009-11-03 8 views
25

たとえば、私は200列のテーブルを持っており、その大部分は使用されていません。2つのJPAエンティティが同じテーブルにある

頻繁に使用される10個の列にSmallEntityをマップします。私は他のエンティティとの関連でそれを使用します。それは速く読み込まれ、メモリをほとんど消費せず、私を幸せにします。

しかし、時々私は200の列を表示する必要があります。 BigEntityクラスを200列にマップしたいと思います。他のエンティティにバインドされておらず、関連付けられていません。

質問:これは何か経験がありますか?たとえば、第一レベルのキャッシュ、汚れたチェック、エンティティのライフサイクル全体のように、Hibernateが抱える問題を認識していますか?

+1

良い質問です。新しいフレームワークへの移行は、そのような疑問に対するもう一つの理由になる可能性があります。例えば。レガシーシステムと新しいシステムが存在する可能性があり、両方とも同じデータベースに対して動作する必要があります。 – TomR

答えて

17

これを実行する最も簡単な方法は、あなたが使用していないプロパティをマッピングすることで、多くの場合、lazyとして:

<property name="extendedProperty" lazy="true" /> 

... or using Annotations ... 

@Basic(fetch = FetchType.LAZY) 
String getExtendedProperty() { ... } 

Hibernateは最初に、このような性質をロードしないでしょう。代わりに、それらはオンデマンドでロードされます(最初にアクセスされるとき)。 Hibernateに、すべてのプロパティをロードさせるには、HQLクエリのfetch all properties句を使用します。

別の考えられるシナリオは、2つの完全に別々のエンティティを同じテーブルに実際にマッピングすることですが、そのうちの1つをimmutableにします。 は、Hibernateによって異なるエンティティとして扱われることに注意してください.1番目と2番目のレベルのキャッシュは両方とも完全に分離されています(不変性が重要な理由です)。

あなたはは、Hibernate は常に実際の具体的なエンティティタイプを返すため、継承マッピングを経由してこの機能を実現することができません。詳細な説明はHibernate Inheritance Strategyの質問への私の答えを見てください。

+0

この素晴らしい答えをありがとう! –

+0

プロパティのレイジーフェッチには、バイトコードのインストルメンテーションが必要です。それはプロジェクトではよくあることですか? Hibernateは注釈ガイドからです :バイトコードは、Hibernateリファレンスドキュメントを参照してください、このような機能を有効にするために、元のいずれかに追加されます。 は、プロパティレベルの遅延フェッチを有効にするには、あなたのクラスは、インストルメントする必要があります。クラスがインスツルメンテーションされていない場合、プロパティレベルの遅延読み込みは暗黙のうちに無視されます。

+0

はい、レイジープロパティにはバイトコード計測が必要ですが、ビルド時に追加するのは簡単です(http://docs.jboss.org/hibernate/stable/core/reference/en/html/performance.html#performance-fetching-lazyproperties )。怠け者のプロパティ(怠け者のアソシエーションとは対照的に)の使用例はそれほど一般的ではありませんが、非常に珍しいことではありませんので、あまり一般的ではありません。それは確かに前に行われており、それがあなたの懸案事項であれば生産準備が整いました。 – ChssPly76

関連する問題