Jpa EclipseLink基本FetchType.LAZY配置

Jpa EclipseLink基本FetchType.LAZY配置,jpa,eclipselink,lazy-loading,Jpa,Eclipselink,Lazy Loading,我在将实体的属性设置为延迟加载时遇到了一些问题。我浏览了EclipseLink文档,但不知道我做错了什么 基本上,我有一个带有一些列的表,其中一个是文件,文件的大小可能非常大。我希望将文件本身延迟加载,这样当我加载表的所有行时,如果不使用该文件,就不必等待文件加载到内存中 设置: 日食2.6.2 ReportHistoryFile: @Entity @Table(name = "REPORT_HISTORY_FILES") @NamedQueries({ @NamedQuery(name

我在将实体的属性设置为延迟加载时遇到了一些问题。我浏览了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=null;
试一试{
list=(list)em.createNamedQuery(“ReportHistoryFile.findAll”)
.getResultList();
}catch(javax.persistence.noresulte){
log.info(“未找到报告历史记录文件记录”);
}捕获(例外e){
log.error(e.getMessage(),e);
}
我看到它被打印到控制台上:

[EL Fine]:sql:2017-01-25 10:35:44.223--服务器会话(1159663071)--连接(39105078)--根据CREATEDATE描述的报告历史文件顺序选择文件ID、内容类型、CREATEDATE、文件内容、文件名、文件大小


请注意,文件内容仍在语句中。我错过了什么?我认为我的persistence.xml文件中不需要任何特殊的东西来实现基本的延迟加载,但我可能错了。提前谢谢

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

  • 静态织造
  • 动态织造

如何做到这一点您可以阅读,可以找到工作示例

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

  • 静态织造
  • 动态织造

如何做到这一点您可以阅读,工作示例可以找到

这可能会有所帮助-@MaciejKowalski与Hibernate有关,而不是EclipseLink,所以我不确定这是否适用。谢谢你!遗憾的是,JPA规范将懒惰/急切设置视为JPA提供者的“提示”。我使用的JPA提供者(DataNucleus)接受我告诉它的内容,不会凌驾于我的意愿之上,而你的(EclipseLink)认为它知道得最好,所以总是把它拉回来。不要认为有办法解决这个问题(除了切换提供商!!)。。。尝试一个EntityGraph,看看他们在使用它时是否有意义?Neil,我相信你完全知道,在某些情况下,大多数提供者都会延迟加载基本功能,就像OneToOnes一样,这就是为什么在JPA规范中将它们作为提示保留的原因。EclipseLink要求对java类使用字节码增强(编织)因此,可以对它们进行检测,以支持惰性基础和OneToOne映射。你不需要切换提供者,只要看看Chris,我很清楚我使用的一个实现满足了人们的要求,我听到人们说他们的实现没有做什么,所以我根据我知道的事实回答。如果用户没有增强该类,并且他们正在请求一些需要它的东西(或者它已经这样做了),那么EclipseLink可能会给用户提供一条合适的消息。无论哪种方式,实现都有做得更好的空间……这可能会有所帮助-@MaciejKowalski与Hibernate有关,而不是EclipseLink,所以我不确定这是否适用。谢谢你!遗憾的是,JPA规范将懒惰/急切设置视为JPA提供者的“提示”。我使用的JPA提供者(DataNucleus)接受我告诉它的内容,不会凌驾于我的意愿之上,而你的(EclipseLink)认为它知道得最好,所以总是把它拉回来。不要认为有办法解决这个问题(除了切换提供商!!)。。。尝试一个EntityGraph,看看他们在使用它时是否有意义?Neil,我相信你完全知道,在某些情况下,大多数提供者都会延迟加载基本功能,就像OneToOnes一样,这就是为什么在JPA规范中将它们作为提示保留的原因。EclipseLink要求对java类使用字节码增强(编织)因此,可以对它们进行检测,以支持惰性基础和OneToOne映射。你不需要切换提供者,只要看看Chris,我很清楚我使用的一个实现满足了人们的要求,我听到人们说他们的实现没有做什么,所以我根据我知道的事实回答。如果用户没有增强该类,并且他们正在请求一些需要它的东西(或者它已经这样做了),那么EclipseLink可能会给用户提供一条合适的消息。无论哪种方式,实现都有做得更好的空间。。。
    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);
    }