2012-04-11 1 views
5

私は画像情報を保持するテーブルImageを持っています。私はまた、画像そのものを保存したい。だから私はJPA:BLOBをフェッチLazyで同じテーブルに格納する必要がありますか、それを別のテーブルに格納して1対1の関係をフェッチする必要があります

1.Storeは、同じ画像テーブルのBlobとは、それは怠惰としてフェッチする必要があり

2.Create

@Basic(optional = false, fetch = FetchType.LAZY) 
@Lob 
@Column(name = "IMAGE_BLOB", length=100000) //This will generate MEDIUMBLOB 
private byte[] imageBlob; 

下または
Imageと別のテーブル ImageBlobOneToOneの関係、怠惰な関係を取得する

@OneToOne(cascade = CascadeType.ALL, mappedBy = "image", fetch=FetchType.LAZY) 
private ImageBlob imageBlob; 

これらのtwパフォーマンスの面で同じテクニックですか?

+0

最初の実装として行います。あなたが遅れてフェッチしている場合、それは影響を与えません。 BLOBを返す必要がある場合は、行の一意のIDに基づいて返す別のメソッドを記述できます。 – Phani

+0

@Phani:ありがとう。 –

+0

質問を受け入れるか、質問を終了してください。 – Phani

答えて

3

どちらも同じパフォーマンスになるはずですが、大きなブロブの場合は2番目をお勧めします。

データベースにはブロブがあり、それを自分のオブジェクトに分けたほうがよいでしょう。これにより、ブロブをより詳細に制御できます。

+0

あなたの洞察力を大変ありがとうございます –

3

私が知る限り、最初はJPAプロバイダとしてHibernateとEclipseLinkでは動作しません。 LAZYはプロバイダのヒントです。これらはエラーや警告を報告することなく熱心に読み込まれます。

クラスウィービングが有効になっている場合にのみ、OneToOneの関連付けが遅延します。それ以外の場合は、どちらも役に立ちません。

"entity"と "id"という属性を持つLazyBlobと呼ばれる完全に別のテーブルを使用して、このテーブルからlob lazilyをフェッチするユーティリティクラスを作成しました。

+0

LAZYは基本的にEclipseLink(製織を使用)で動作します。ただし、大規模なLOBの場合は通常、別の表が適しています。 – James

+0

@James LAZYはEclipselink製織で*仕事の種類*をしています。少なくともEclipselink 2.3.1では単純な問合せでも機能しますが、別の表にフェッチするとLOBが賢くフェッチされます。私はいくつかのアプリケーションでこの制限を回避する必要がありました。 – gpeche

+0

だからこそ、私は答えにアプローチを使用しました。 LAZYがヒントである限り、動作が停止するときは決して知りません。ファイルが小さければそれは問題ではありませんが、サイズが大きく、必要なケースがほんのわずかであるにもかかわらずです。 – Oliv

関連する問題