[英]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
,又包括CModel
和DModel
。 它具有获取CModel
和DModel
当抓取的AModel
被调用,否则你的查询将无法完成,如果的对象CModel
和DModel
不取的,并使得整个目的fetchType作为Eager
的AModel
会走了
这发生在从BModel到CModel和DModel的oneToOne关系的原因。
当您使用FetchType.LAZY定义关系时,hibernate需要使用代理替换该对象,因此当您第一次访问它时,它可以加载它。
现在使用可以为空的oneToOne关系,hibernate没有机会知道,如果关系为null或者没有执行select,则导致关系中的表通常使用相同的主键。
因此,如果您的关系是不可为空的,那么定义optional = false并且不进行急切提取。 如果不是这种情况,您也可以使用oneToMany关系。
另请参阅此stackoverflow问题
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.