なまけ休止状態にCLOBを読み込みます
質問
があり1ビットをグーグルこれについて見つけることができる多くのだが、私は非常にこの問題に対する可能な解決策を見つけていない。
は、基本的に私が持っているもの、私はオンデマンドでロードされているしたい特定のクラスに大きなCLOBです。これを行うには素朴な方法は以下のようになります:
class MyType {
// ...
@Basic(fetch=FetchType.LAZY)
@Lob
public String getBlob() {
return blob;
}
}
どうやら原因私はOracleドライバを使用しているという事実に、しかし動作しないことは、すなわち、LOBオブジェクトは、単純なハンドルとして扱われませんが、常にロードされます。それとも私は私の進出から信じるように導かれてきました。そこ遅延プロパティ読み込みのための特別な機器を使用して一つの解決策はありますが、Hibernateのドキュメントは、彼らが正しくその仕事をすることに興味未満だ示唆するように見えるようなので、私はむしろ、そのルートを行かないと思います。特に、余分なコンパイルパスとを実行することで、全てます。
だから私は想定していた次のソリューションは、別の型にこのオブジェクトを分離し、関連付けの定義されました。ドキュメントは矛盾する情報を提供しながら、残念ながら、それは遅延読み込みが共有主キーを持つOneToOne団体に動作しないことを私には明らかです。私はManyToOneとして関連の片側を設定すると思いますが、私は、共有主キーがあるときにこれを行うにはどのように非常によく分かりません。
だから、誰もがこのことについてに行くための最善の方法を提案することができますか?
解決
によれば、これはPostgreSQLが本当に怠け者Blobとして実装のみを。そこで、最善の解決策は、別のテーブルにBLOBを移動することです。あなたが共有主キーを使用する必要がありますか?なぜあなたはこのような何かをしない。
public class MyBlobWrapper {
@Id
public Long getId() {
return id;
}
@Lob
public String getBlob() {
return blob;
}
@OneToOne(fetch=FetchType.LAZY,optional=false)
public MyClass getParent() {
return parent;
}
}
他のヒント
の代わりに休止状態の注釈とともにequilibristicsを行うための、一つはちょうどString
(またはClob
)にBlob
からフィールドを変換しようとしてます:
@Lob
@Basic(fetch=FetchType.LAZY)
@Column(name = "FIELD_COLUMN")
public Clob getFieldClob() {
return fieldClob;
}
public void setFieldClob(Clob fieldClob) {
this.fieldClob = fieldClob;
}
@Transient
public String getField()
{
if (this.getFieldClob()==null){
return null;
}
try {
return MyOwnUtils.readStream(this.getFieldClob().getCharacterStream());
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public void setField(String field)
{
this.fieldClob = Hibernate.createClob(field);
}
(フィールドは、Oracleに、なまけロードするために始めた)私のために働いています。
あなたはあなたの問題は、次の休止状態機能に関連している場合、私は疑問にHibernateを使用しているように見えるのでます:
のHibernate3はプロパティごとの遅延フェッチをサポートしています。この 最適化手法は、フェッチグループとして知られています。その点に注意してください これは、主にマーケティング機能です。行読み取り最適化することは、はるかにあります 列の最適化が読み込むよりも重要。しかし、唯一のロード クラスのいくつかのプロパティは、極端な場合に有用である可能性があります。ために レガシーテーブルは列の数百人とデータを持っている例、 モデルを向上させることができない。
レイジープロパティは、をロードするのビルド時のバイトコード組み込みを必要。もし 永続クラスは、Hibernateは怠け者無視する、強化されていません プロパティの設定と即時フェッチに復帰ます。
Mavenのを使用して休止状態のためのバイトコードインスツルメンテーションを参照してください。
古いポスト、しかし、@TadeuszKopecの答えのおかげで、私を助けただけに。
JPAとブロブの遅延読み込みを行うことは困難であるように見えます。私は@OneToOneの関連付けを試みたが、それは助け以上のものを複雑にします。
:私はMyClassの(親同表、同じID)との関連で、別のクラスのバイトを移動しました@Entity
@Table(name="MyTable")
public class MyBlobWrapper{
@Id
@Column(name = "id") // id of MyTable, same as MyClass
private Long id;
@Lob
private byte[] bytes;
}
@Entity
@Table(name="MyTable")
public class MyClass{
@Id
@Column(name = "id")
private Long id;
// other fields .....
}
ただ、ブロブを保存する前に、親をフラッシュするために覚えてます:
em.persist(parent);
em.flush();
em.merge(new MyBlobWrapper(parent_id,new byte[1000]));
今、私は一人でPDFを読み込むことができます:
String query1 = " select PDF from MyBlobWrapper PDF where PDF.id = :id";
私はちょうど助けJPA、希望を持って初心者です。