我正在使用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);
答案 0 :(得分:1)
这里的原因是当实体AModel
包含实体BModel
时,实体CModel
和DModel
。调用CModel
的提取时,必须提取DModel
和AModel
,否则,如果CModel
和{的对象,您的查询将无法完成{1}}未获取{1}},并且DModel
的fetchType为Eager
的整个目的都将消失。
答案 1 :(得分:1)
这发生了从BModel到CModel和DModel的oneToOne关系的原因。
当你使用FetchType.LAZY定义一个关系时,hibernate需要用一个代理替换该对象,这样当你第一次访问它时,它就可以加载它。
现在使用可以为空的oneToOne关系,hibernate没有机会知道,如果关系为null或者没有执行select,则导致关系中的表通常使用相同的主键。
因此,如果您的关系是不可为空的,那么定义optional = false并且不会进行急切的提取。如果不是这种情况,您也可以使用oneToMany关系。