Java 具有渴望获取类型属性的对象执行对该属性的延迟加载属性的查询。。为什么?
我使用的是SpringBoot,当为AModel调用存储库时,存储库会执行对BModel、CModel和DModel的查询,即使我没有调用CModel或DModel。你知道为什么会发生这种情况,以及我如何预防它吗Java 具有渴望获取类型属性的对象执行对该属性的延迟加载属性的查询。。为什么?,java,hibernate,spring-boot,Java,Hibernate,Spring Boot,我使用的是SpringBoot,当为AModel调用存储库时,存储库会执行对BModel、CModel和DModel的查询,即使我没有调用CModel或DModel。你知道为什么会发生这种情况,以及我如何预防它吗 @Entity public class AModel extends Model { @OneToOne(fetch = FetchType.EAGER) @JsonIgnore private BModel; } @Entity public class BMode
@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
。调用AModel
的fetch时,它必须获取CModel
和DModel
,否则如果没有获取CModel
和DModel
的对象,您的查询将无法完成,将fetchType设置为Eager
forAModel
的全部目的都将消失。这是因为从BModel到CModel和DModel的oneToOne关系
当您使用FetchType.LAZY定义关系时,hibernate需要用代理替换该对象,以便在您第一次访问该对象时,它可以加载该对象
现在,对于可以为null的oneToOne关系,hibernate没有机会知道,如果不执行select,关系是否为null,因为关系中的表通常使用相同的主键
因此,如果您的关系不可为null,那么define optional=false,并且不会执行即时抓取。如果不是这样,你也可以用一对一的关系来代替
另请参见此是否有任何可能的方法使B保持懒惰,并防止C和D获取数据?