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