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

时间:2015-05-28 21:46:46

标签: java hibernate spring-boot

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

2 个答案:

答案 0 :(得分:1)

这里的原因是当实体AModel包含实体BModel时,实体CModelDModel。调用CModel的提取时,必须提取DModelAModel,否则,如果CModel和{的对象,您的查询将无法完成{1}}未获取{1}},并且DModel的fetchType为Eager的整个目的都将消失。

答案 1 :(得分:1)

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

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

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

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

另见stackoverflow question