繁体   English   中英

具有Eager fetch Type属性的对象,对该属性的延迟加载属性执行查询。为什么?

[英]An object with an Eager fetch Type property, executes queries for the lazy loaded properties of that property.. why?

我正在使用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);

这里的原因是,当实体AModel包括实体BModel ,又包括CModelDModel 它具有获取CModelDModel当抓取的AModel被调用,否则你的查询将无法完成,如果的对象CModelDModel不取的,并使得整个目的fetchType作为EagerAModel会走了

这发生在从BModel到CModel和DModel的oneToOne关系的原因。

当您使用FetchType.LAZY定义关系时,hibernate需要使用代理替换该对象,因此当您第一次访问它时,它可以加载它。

现在使用可以为空的oneToOne关系,hibernate没有机会知道,如果关系为null或者没有执行select,则导致关系中的表通常使用相同的主键。

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

另请参阅此stackoverflow问题

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM