JPA と EclipseLink を使用した JSF アプリケーションがあります。大きなバイナリ データを格納するための Lob タイプを含むいくつかの属性を持つエンティティがあります。
エンティティを頻繁に検索してリストに表示する必要があります。ユーザーがそれを表示したい場合にのみ、Large Binary データが必要になります。
バイナリ データを遅延ロードする方法はありますか? それとも、1 対 1 の関係を持つ別のエンティティとして取り出す必要がありますか?
JPA と EclipseLink を使用した JSF アプリケーションがあります。大きなバイナリ データを格納するための Lob タイプを含むいくつかの属性を持つエンティティがあります。
エンティティを頻繁に検索してリストに表示する必要があります。ユーザーがそれを表示したい場合にのみ、Large Binary データが必要になります。
バイナリ データを遅延ロードする方法はありますか? それとも、1 対 1 の関係を持つ別のエンティティとして取り出す必要がありますか?
@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
}
簡単にできます。次の注釈を使用します。
@Basic(fetch=FetchType.LAZY)