2016-05-26 1 views
1

jpaを使用して子エンティティのフィールドの一部を除外したいとします。 例:jpa oracle dbを使用して子エンティティを読み取っているときにフィールドを除外する

Class Person extends Serializable 
{ 
    private String firstName; 
    private String lastName; 
    private String id; 
    private PersonalInformation personalInformation; 
} 

Class PersonalInformation extends Serializable 
{ 
    private Date dob; 
    private List<PersonalDocument> documents; 
} 

Class PersonalDocument extends Serializable 
{ 
    private String fileName; 
    private int fileSize; 
    private byte[] fileData; 
} 

私は人の詳細を取得しようとしたとき、私はPersonalInformationとPersonalDocumentリストなど、人に関するすべての情報を、取得することもできますが、PersonalDocument.fileDataは巨大なことができるので、毎回これを取得DBからのフィールドがパフォーマンスに影響を与えています。

私はPersonalDocument.fileDataフィールドを読み込み中に無視/除外したいと思っていました。同じもののjpaクエリを書く方法を知りたかったのです。

+0

EntityGraphsをフィールドにFetchModeを設定する、または使用して、あなたがそれを行うことができ –

答えて

0

次に、ファイルデータを遅延取得して、フィールドにアクセスしたときにデータベースからオンデマンドでフェッチする方法があります。 JPA仕様では、プロバイダの実装では、(関連ではなく)個々のフィールドの遅延読み込みを実際にサポートする必要はありません。この領域のディレクティブは、永続性プロバイダのヒントとしかみなされません。

私は、Hibernateがフィールドの遅延読み込みをサポートしていることを知っています。この分野でも同様の質問がたくさんありますが、という確定的なものを見つけることができませんでした。

まず、しかし、あなたは以下の@Lobがデフォルトで怠惰であることを示唆しているので、我々はしかし、中に害を追加@Basic(fetch=LAZY)を必要としないではないかもしれ@Lob注釈(http://docs.oracle.com/javaee/6/api/javax/persistence/Lob.html

import javax.persistence.Lob; 

public class PersonalDocument implements Serializable 
{ 
    private String fileName; 
    private int fileSize; 

    @Basic(fetch=LAZY) //optional?? 
    @Lob 
    private byte[] fileData; 
} 

でフィールドをマークする必要がありますとにかくそれを追加します。

https://hibernate.atlassian.net/browse/ANN-418

いくつかの類似したスタックオーバーフローに関する質問は@Lobを追加すると、すべてのことが、このようなフィールド遅延ロードを持つことが必要であることを報告して見えるが、Hibernateのドキュメント自体はその怠惰なフィールドのロードを注意してくださいは、バイトコードの強化が必要です。

https://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/

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

、要約すると:

  1. @Lobを追加し、それが動作するかどうかを確認。
  2. そうでない場合は、@Basic(fetch = LAZY)を追加して動作するかどうかを確認してください。
  3. そうでない場合は、ビルドにバイトコードの拡張機能を追加するか、

https://docs.jboss.org/hibernate/orm/5.0/topical/html/bytecode/BytecodeEnhancement.html

関連する問題