如何使用JPA延迟加载实体属性

时间:2013-05-27 03:20:19

标签: java jpa orm persistence eclipselink

我有一个带JPA和EclipseLink的JSF应用程序。有一个实体具有多个属性,包括用于存储大型二进制数据的Lob类型。

我需要经常搜索实体并将它们显示在列表中。只有当用户想要查看时,才需要大二进制数据。

我可以使用延迟加载二进制数据的方法吗?或者,我是否必须将其作为具有一对一关系的另一个实体?

2 个答案:

答案 0 :(得分:2)

使用Hibernate时,您有两个选项as explained in this article

您可以对要加载的属性使用字节码增强和@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
}

答案 1 :(得分:0)

可以轻松完成。使用以下注释。

@Basic(取= FetchType.LAZY)