EclipseLink Basic FetchType.LAZY配置

时间:2017-01-25 16:52:10

标签: jpa eclipselink lazy-loading

我在将实体的属性设置为延迟加载时遇到了一些麻烦。我已经浏览了EclipseLink文档,但无法弄清楚我做错了什么。

基本上,我有一个包含一些列的表,其中一个是文件,其大小可能非常大。我想让文件本身延迟加载,这样当我加载表的所有行时,如果不使用它,我就不必等待文件加载到内存中。

设置:

EclipseLink 2.6.2

ReportHistoryFile:

@Entity
@Table(name = "REPORT_HISTORY_FILES")
@NamedQueries({
    @NamedQuery(name = "ReportHistoryFile.findAll", query = "SELECT p FROM ReportHistoryFile p order by p.createDate DESC")})
public class ReportHistoryFile implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @SequenceGenerator(name = "SEQ_REPORTHISTORYFILE_GEN", sequenceName = "SEQ_REPORTHISTORYFILE", allocationSize = 1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_REPORTHISTORYFILE_GEN")
    private Long fileId;

    // note the basic lazy setting
    @Basic(fetch = FetchType.LAZY)
    @Column(name = "FILE_CONTENT", nullable = false)
    private byte[] fileContent;
    @Column(name = "FILE_NAME", nullable = false)
    private String fileName;
    private String contentType;
    @Column(name = "FILE_SIZE")
    private Long fileSize;
    @Column(name = "CREATEDATE")
    private Date createDate;

    public ReportHistoryFile() {
    }

    public Long getFileId() {
        return fileId;
    }

    public void setFileId(Long fileId) {
        this.fileId = fileId;
    }

    public byte[] getFileContent() {
        if (fileContent == null) {
            return null;
        }
        return Arrays.copyOf(fileContent, fileContent.length);
    }

    public void setFileContent(byte[] fileContentIn) {
        if (fileContentIn != null) {
            this.fileContent = Arrays.copyOf(fileContentIn, fileContentIn.length);
        }
    }

    public String getFileName() {
        return fileName;
    }

    public void setFileName(String fileName) {
        this.fileName = fileName;
    }

    public String getContentType() {
        return contentType;
    }

    public void setContentType(String contentType) {
        this.contentType = contentType;
    }

    public Long getFileSize() {
        return fileSize;
    }

    public void setFileSize(Long fileSize) {
        this.fileSize = fileSize;
    }

    public void setCreateDate(Date createDate) {
        this.createDate = createDate;
    }

    public Date getCreateDate() {
        return this.createDate;
    }
}

但是当我执行这段代码时(em是EntityManager):

    List<ReportHistoryFile> list = null;
    try {
        list = (List<ReportHistoryFile>) em.createNamedQuery("ReportHistoryFile.findAll")
                .getResultList();
    } catch (javax.persistence.NoResultException e) {
        log.info("No Report History File records found.");
    } catch (Exception e) {
        log.error(e.getMessage(), e);
    }

我看到这打印到控制台:

  

[EL Fine]:sql:2017-01-25 10:35:44.223 - ServerSession(1159663071) - 连接(39105078) - SELECT FILEID,CONTENTTYPE,CREATEDATE,FILE_CONTENT,FILE_NAME,FILE_SIZE来自REPORT_HISTORY_FILES ORDER BY CREATEDATE DESC

请注意,FILE_CONTENT仍在语句中。我错过了什么?我认为我的persistence.xml文件中没有任何特殊内容可用于基本的延迟加载,但我可能错了。提前谢谢!

1 个答案:

答案 0 :(得分:0)

为了对属性和关系启用延迟加载功能,必须使用eclipseLink编织您的类,

  • 静态编织
  • 动态编织

如何执行此操作,您可以阅读here,可以找到工作示例here