目前,我在hbernate3中观察到以下行为。 如果我有 @BatchSize(尺寸= 5) set,然后hibernate将在一个SQL查询中获取映射类型的5个子集。
如果我有 .setFetchMode(“set”,FetchMode.JOIN); 然后,hibernate将急切地在单个SQL查询中获取映射类型的所有子集。
然而,当我设定 .setFetchMode(“commands”,FetchMode.SELECT); ,然后hibernate仍然使用批量提取,而不是延迟提取。
有没有办法强制hibernate使用延迟抓取时 @BatchSize 已经确定了?
同样的问题适用于何时 @Fetch(FetchMode.SUBSELECT) 已经确定了。
答案 0 :(得分:7)
如果要以编程方式覆盖这些设置,可以考虑使用@FetchProfile。 只需为实体创建一个@FetchProfile:
@FetchProfiles({
@FetchProfile(name = "profileName", fetchOverrides = {
@FetchProfile.FetchOverride(entity = YourEntity.class,
association = "anAssociation",
mode = FetchMode.JOIN),
...
})
})
并在您的服务/存储库方法中启用该配置文件,如:
session.enableFetchProfile( "profileName" );
并且您的自定义提取设置将适用于该会话。
答案 1 :(得分:0)
很抱歉, @BatchSize 用于解决“N + 1问题”,但不会急切地或懒惰地询问Hibernate加载实体。尝试按关键字搜索:“Hibernate,n + 1问题,批量大小”。