我有一个带有 JPA 和 EclipseLink 的 JSF 应用程序。有一个实体具有多个属性,包括用于存储大型二进制数据的 Lob 类型。
我需要经常搜索实体并将它们显示在列表中。只有当用户想要查看时,才需要大二进制数据。
我可以有一种方法来延迟加载二进制数据吗?还是我必须将其作为另一个具有一对一关系的实体取出?
我有一个带有 JPA 和 EclipseLink 的 JSF 应用程序。有一个实体具有多个属性,包括用于存储大型二进制数据的 Lob 类型。
我需要经常搜索实体并将它们显示在列表中。只有当用户想要查看时,才需要大二进制数据。
我可以有一种方法来延迟加载二进制数据吗?还是我必须将其作为另一个具有一对一关系的实体取出?
您可以使用字节码增强以及@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>
或者您可以为同一个数据库表定义多个子实体。考虑到您有一个attachment
表,其中有一content
列存储 BLOB。
您可以在公共基类中映射非惰性属性:
@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
列。
如果您需要获取包括content
一列在内的所有列,则可以使用此实体:
@Entity @Table(name = "attachment")
public class Attachment
extends BaseAttachment {
@Lob
private byte[] content;
//Getters and setters omitted for brevity
}
可以轻松完成。使用以下注释。
@Basic(fetch=FetchType.LAZY)