Hibernate 休眠批处理抓取到延迟加载

Hibernate 休眠批处理抓取到延迟加载,hibernate,lazy-loading,Hibernate,Lazy Loading,目前,我在hbernate3中观察到以下行为。 如果我有 @批量大小(大小=5) 设置,则hibernate将在一个SQL查询中获取映射类型的5个子集 如果我有 .setFetchMode(“set”,FetchMode.JOIN); ,然后hibernate将在单个SQL查询中急切地获取映射类型的所有子集 然而,当我设置 .setFetchMode(“命令”,FetchMode.SELECT); ,那么hibernate仍然使用批处理抓取,而不是惰性抓取 有没有办法强迫hibernate在 @

目前,我在hbernate3中观察到以下行为。 如果我有 @批量大小(大小=5) 设置,则hibernate将在一个SQL查询中获取映射类型的5个子集

如果我有 .setFetchMode(“set”,FetchMode.JOIN); ,然后hibernate将在单个SQL查询中急切地获取映射类型的所有子集

然而,当我设置 .setFetchMode(“命令”,FetchMode.SELECT); ,那么hibernate仍然使用批处理抓取,而不是惰性抓取

有没有办法强迫hibernate在 @批量大小 设定好了吗

同样的问题也适用于何时 @Fetch(FetchMode.SUBSELECT)
已设置。

抱歉,但是@BatchSize用于解决“N+1问题”,而不是要求Hibernate急切或懒惰地加载实体。尝试用关键字搜索:“Hibernate,N+1问题,批量大小”。

< P>如果你想以编程方式重写这些设置,你可以考虑使用@ FETCHPrror。 只需为实体创建@FetchProfile:
@FetchProfiles({
  @FetchProfile(name = "profileName", fetchOverrides = {
    @FetchProfile.FetchOverride(entity = YourEntity.class, 
                                association = "anAssociation", 
                                mode = FetchMode.JOIN),
...
}) })
@FetchProfiles({
@FetchProfile(name=“profileName”,fetchOverrides={
@FetchProfile.FetchOverride(entity=YourEntity.class,
association=“anasociation”,
mode=FetchMode.JOIN),
…
}) })
并在服务/存储库方法中启用该配置文件,如:

session.enableFetchProfile(“profileName”);

您的自定义提取设置将适用于该会话。

我知道它有助于解决N+1问题。但是,它会覆盖急切/懒惰设置。我的问题是,这些设置是否可能共存并通过编程进行设置。这听起来像是我在寻找的。我可以在单个会话中的两个事务之间启用/禁用此配置文件吗?@iliaden是的,您可以在同一会话中使用会话#disableFetchProfile(profileName)禁用此配置文件。您还可以使用Session#isFetchProfileEnabled(profileName)来确定是否启用或禁用了提取配置文件。
session.enableFetchProfile( "profileName" );