【问题标题】:An object with an Eager fetch Type property, executes queries for the lazy loaded properties of that property.. why?具有 Eager fetch Type 属性的对象执行对该属性的延迟加载属性的查询。为什么?
【发布时间】:2015-05-28 21:46:45
【问题描述】:

我正在使用 SpringBoot,当为 AModel 调用存储库时,即使我没有调用 CModel 或 DModel,存储库也会执行 BModel、CModel 和 DModel 的查询。知道为什么会发生这种情况以及如何预防吗?

@Entity
public class AModel extends Model {

  @OneToOne(fetch = FetchType.EAGER)
  @JsonIgnore
  private BModel;
}

@Entity
public class BModel extends Model {

  @OneToOne(fetch = FetchType.LAZY)
  private CModel;

  @OneToOne(fetch = FetchType.LAZY)
  private DModel;
}

 @Query("select a from com.project.models.AModel a where a.id = :id")
 @Override
 Candidate findOne(@Param("id")Long id);

【问题讨论】:

    标签: java hibernate spring-boot


    【解决方案1】:

    这里的原因是当实体AModel包含实体BModel时,实体又包含CModel和DModel。当调用AModel 的提取时,它必须提取CModel 和DModel,否则如果没有提取CModel 和DModel 的对象,并且整个将 fetchType 设置为 Eager for AModel 的目的将不复存在。

    【讨论】:

    • 有什么办法可以让 B 保持懒惰,并防止 C 和 D 抓取?
    【解决方案2】:

    这是从 BModel 到 CModel 和 DModel 的 oneToOne 关系的原因。

    当你用 FetchType.LAZY 定义关系时,hibernate 需要用代理替换对象,这样当你第一次访问它时,它可以加载它。

    现在有了可以为空的 oneToOne 关系,hibernate 没有机会知道,如果不执行选择,关系是否为空,导致关系中的表通常使用相同的主键。

    因此,如果您的关系不可为空,则定义 optional = false 并且不会进行急切获取。如果不是这种情况,您也可以使用 oneToMany 关系。

    另见stackoverflow question

    【讨论】:

      猜你喜欢
      • 2022-08-13
      • 1970-01-01
      • 2013-07-03
      • 1970-01-01
      • 1970-01-01
      • 2017-12-28
      • 1970-01-01
      • 1970-01-01
      • 2014-01-07
      相关资源
      最近更新 更多