具有 Eager fetch 类型 属性 的对象执行对该 属性 的延迟加载属性的查询。为什么?
An object with an Eager fetch Type property, executes queries for the lazy loaded properties of that property.. why?
我正在使用 SpringBoot,当为 AModel 调用存储库时,存储库正在执行对 BModel、CModel 和 DModel 的查询,即使我既没有调用 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
时,实体BModel
又包含CModel
和DModel
。它必须在调用 AModel
的提取时提取 CModel
和 DModel
,否则如果 CModel
和 [=13 的对象,您的查询将无法完成=] 不会被获取,将 AModel
的 fetchType 设置为 Eager
的整个目的将消失。
发生这种情况的原因是从 BModel 到 CModel 和 DModel 的一对一关系。
当你用 FetchType.LAZY 定义关系时,hibernate 需要用代理替换对象,这样当你第一次访问它时,它可以加载它。
现在有了可以为空的 oneToOne 关系,hibernate 没有机会知道关系是否为空而不执行 select,因为关系中的 table 通常使用相同的主关键。
因此,如果您的关系不可为空,则定义 optional = false 并且不会进行预取。如果不是这种情况,您也可以改用 oneToMany 关系。
另请参阅此 Whosebug question
我正在使用 SpringBoot,当为 AModel 调用存储库时,存储库正在执行对 BModel、CModel 和 DModel 的查询,即使我既没有调用 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
时,实体BModel
又包含CModel
和DModel
。它必须在调用 AModel
的提取时提取 CModel
和 DModel
,否则如果 CModel
和 [=13 的对象,您的查询将无法完成=] 不会被获取,将 AModel
的 fetchType 设置为 Eager
的整个目的将消失。
发生这种情况的原因是从 BModel 到 CModel 和 DModel 的一对一关系。
当你用 FetchType.LAZY 定义关系时,hibernate 需要用代理替换对象,这样当你第一次访问它时,它可以加载它。
现在有了可以为空的 oneToOne 关系,hibernate 没有机会知道关系是否为空而不执行 select,因为关系中的 table 通常使用相同的主关键。
因此,如果您的关系不可为空,则定义 optional = false 并且不会进行预取。如果不是这种情况,您也可以改用 oneToMany 关系。
另请参阅此 Whosebug question