4

JPA と EclipseLink を使用した JSF アプリケーションがあります。大きなバイナリ データを格納するための Lob タイプを含むいくつかの属性を持つエンティティがあります。

エンティティを頻繁に検索してリストに表示する必要があります。ユーザーがそれを表示したい場合にのみ、Large Binary データが必要になります。

バイナリ データを遅延ロードする方法はありますか? それとも、1 対 1 の関係を持つ別のエンティティとして取り出す必要がありますか?

4

2 に答える 2

7

@Basic(fetch=FetchType.LAZY)遅延ロードされる属性とともにバイトコード拡張を使用します。

<plugin>
    <groupId>org.hibernate.orm.tooling</groupId>
    <artifactId>hibernate-enhance-maven-plugin</artifactId>
    <version>${hibernate.version}</version>
    <executions>
        <execution>
            <configuration>
                <failOnError>true</failOnError>
                <enableLazyInitialization>true</enableLazyInitialization>
            </configuration>
            <goals>
                <goal>enhance</goal>
            </goals>
        </execution>
    </executions>
</plugin>

または、同じデータベース テーブルに複数のサブエンティティを定義できます。BLOB を格納する列を持つattachmentテーブルがあるとします。content

共通の基本クラスで非遅延属性をマップできます。

@MappedSuperclass
public class BaseAttachment {
 
    @Id
    @GeneratedValue
    private Long id;
 
    private String name;
 
    @Enumerated
    @Column(name = "media_type")
    private MediaType mediaType;
 
    //Getters and setters omitted for brevity
}

非遅延属性のみをフェッチする必要がある場合は、基本クラスを拡張するだけのエンティティが必要です。

@Entity @Table(name = "attachment")
public class AttachmentSummary extends BaseAttachment {}

contentこれにより、列がフェッチされることはありません。

1 つを含むすべての列を取得する必要がある場合は、次のcontentエンティティを使用できます。

@Entity @Table(name = "attachment")
public class Attachment 
    extends BaseAttachment {
 
    @Lob
    private byte[] content;
 
    //Getters and setters omitted for brevity
}
于 2016-09-20T05:46:01.300 に答える
2

簡単にできます。次の注釈を使用します。

@Basic(fetch=FetchType.LAZY)

于 2013-05-27T03:22:54.697 に答える