Hibernate 正在加载惰性对象而不被要求
Hibernate is loading lazy objects without being asked for
为了保持传输的数据较小,我在数据库中为我的文件创建了两个实体。文件头保存一些关于文件和 fileblob 的一般信息,包括 fileId 和 blob。
通常,我只需要询问一般文件信息。如果我现在要求文件头列表,不幸的是休眠 selects fileblob(每个都在一个 select 中)。所以这是我的例子:
摘自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;
从select离子中提取:
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 应该足以满足我的目的?
提前感谢您的提示和建议。我只是觉得我找错了树...
亲切的问候,
文森特
编辑: 开始研究休眠源代码。在 DefaultLoadEventListener.proxyOrLoad(...)
中,hibernate 决定天气是否作为代理加载。在我的示例中,传递了以下选项:LoadEventListener.INTERNAL_LOAD_NULLABLE
这导致访问数据库。只是不明白为什么....
Edit2: 问题已解决:将 optional = false
添加到 OneToOne-annotation:
@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;
问题已解决,在 OneToOne 注释中添加 optional = false
即可解决问题。
查看相似度post
为了保持传输的数据较小,我在数据库中为我的文件创建了两个实体。文件头保存一些关于文件和 fileblob 的一般信息,包括 fileId 和 blob。 通常,我只需要询问一般文件信息。如果我现在要求文件头列表,不幸的是休眠 selects fileblob(每个都在一个 select 中)。所以这是我的例子:
摘自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;
从select离子中提取:
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 应该足以满足我的目的?
提前感谢您的提示和建议。我只是觉得我找错了树...
亲切的问候, 文森特
编辑: 开始研究休眠源代码。在 DefaultLoadEventListener.proxyOrLoad(...)
中,hibernate 决定天气是否作为代理加载。在我的示例中,传递了以下选项:LoadEventListener.INTERNAL_LOAD_NULLABLE
这导致访问数据库。只是不明白为什么....
Edit2: 问题已解决:将 optional = false
添加到 OneToOne-annotation:
@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;
问题已解决,在 OneToOne 注释中添加 optional = false
即可解决问题。
查看相似度post