Hibernate正在加载惰性对象而不被请求

Hibernate正在加载惰性对象而不被请求,hibernate,lazy-loading,Hibernate,Lazy Loading,为了使传输的数据保持较小,我在数据库中为我的文件创建了两个实体。fileheader用于保存有关文件和fileblob的一些常规信息,包括fileId和blob。 通常,我只需要询问一般的文件信息。如果我现在要一个文件头列表,hibernate也会选择fileblob(每个文件都在一次选择中)。下面是我的例子: 从Fileh.class中提取: @OneToOne(mappedBy = "fileh", targetEntity = Fileblob.class, fetch = Fetch

为了使传输的数据保持较小,我在数据库中为我的文件创建了两个实体。fileheader用于保存有关文件和fileblob的一些常规信息,包括fileId和blob。 通常,我只需要询问一般的文件信息。如果我现在要一个文件头列表,hibernate也会选择fileblob(每个文件都在一次选择中)。下面是我的例子:

从Fileh.class中提取:

  @OneToOne(mappedBy = "fileh", targetEntity = Fileblob.class, fetch = FetchType.LAZY)
  @org.hibernate.annotations.Cascade({ org.hibernate.annotations.CascadeType.SAVE_UPDATE, org.hibernate.annotations.CascadeType.LOCK })
  private Fileblob fileblob;
选集摘录:

  Criteria createCriteria = persistentSession.createCriteria(Fileh.class);

  List list = createCriteria.list();
控制台日志:

Hibernate: 
    select
        this_.`ID` as ID1_78_0_,
        this_.`CHDATE` as CHDATE2_78_0_,
        this_.`CHUSER` as CHUSER9_78_0_,
        this_.`CRDATE` as CRDATE3_78_0_,
        this_.`CRUSER` as CRUSER10_78_0_,
        this_.`EXTENSION` as EXTENSIO4_78_0_,
        this_.`NAME` as NAME5_78_0_,
        this_.`SIZE` as SIZE6_78_0_,
        this_.`VALID_FROM` as VALID_FR7_78_0_,
        this_.`VALID_TO` as VALID_TO8_78_0_ 
    from
        CORE.`FILEH` this_
Hibernate: 
    select
        fileblob0_.`ID` as ID1_77_0_,
        fileblob0_.`FILEBLOB` as FILEBLOB2_77_0_ 
    from
        CORE.`FILEBLOB` fileblob0_ 
    where
        fileblob0_.`ID`=?
Hibernate: 
    select
        fileblob0_.`ID` as ID1_77_0_,
        fileblob0_.`FILEBLOB` as FILEBLOB2_77_0_ 
    from
        CORE.`FILEBLOB` fileblob0_ 
    where
        fileblob0_.`ID`=? .....(and so on)
我的假设是fetch=FetchType.LAZY应该足以满足我的需要,这是不是错了

提前感谢您的提示和建议。我只是觉得我找错人了

亲切问候,, 文森特

编辑:开始深入到hibernate源代码。在
DefaultLoadEventListener.proxyOrLoad(…)
hibernate决定是否作为代理加载。在我的示例中,传递了以下选项:
LoadEventListener.INTERNAL\u LOAD\u NULLABLE
,这将导致访问数据库。只是还不明白为什么

Edit2:问题已解决:向OneTONE批注添加了
optional=false

@OneToOne(mappedBy = "fileh", targetEntity = Fileblob.class, fetch = FetchType.LAZY, optional = false)
  @org.hibernate.annotations.Cascade({ org.hibernate.annotations.CascadeType.SAVE_UPDATE, org.hibernate.annotations.CascadeType.LOCK })
  private Fileblob fileblob;

问题解决了,在OneTONE注释中添加
optional=false
就可以解决问题


请参见相似性问题的解决,在OneTONE注释中添加
optional=false


请参阅“相似性”

确保在迭代文件列表时,
Fileblob
对象未被访问。您好@rigal,谢谢您的评论,但我没有访问该属性。它似乎在createCriteria.list()中的某个位置被自动取消导出…问题解决了,在OneToOne注释中添加'optional=false'就可以解决问题。请参阅确保在迭代Fileh列表时,
Fileblob
对象未被访问。您好@rigal,谢谢您的评论,但我没有访问该属性。它似乎在createCriteria.list()中的某个位置被自动取消导出…问题解决了,在OneToOne注释中添加'optional=false'就可以解决问题。看见