Hibernate批量提取到延迟加载

时间:2011-06-09 15:53:10

标签: hibernate lazy-loading

目前,我在hbernate3中观察到以下行为。 如果我有     @BatchSize(尺寸= 5) set,然后hibernate将在一个SQL查询中获取映射类型的5个子集。

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

然而,当我设定     .setFetchMode(“commands”,FetchMode.SELECT); ,然后hibernate仍然使用批量提取,而不是延迟提取。

有没有办法强制hibernate使用延迟抓取时     @BatchSize 已经确定了?

同样的问题适用于何时     @Fetch(FetchMode.SUBSELECT) 已经确定了。

2 个答案:

答案 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问题,批量大小”。