Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 具有渴望获取类型属性的对象执行对该属性的延迟加载属性的查询。。为什么?_Java_Hibernate_Spring Boot - Fatal编程技术网

Java 具有渴望获取类型属性的对象执行对该属性的延迟加载属性的查询。。为什么?

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

我使用的是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
时,后者又包括
CModel
DModel
。调用
AModel
的fetch时,它必须获取
CModel
DModel
,否则如果没有获取
CModel
DModel
的对象,您的查询将无法完成,将fetchType设置为
Eager
for
AModel
的全部目的都将消失。

这是因为从BModel到CModel和DModel的oneToOne关系

当您使用FetchType.LAZY定义关系时,hibernate需要用代理替换该对象,以便在您第一次访问该对象时,它可以加载该对象

现在,对于可以为null的oneToOne关系,hibernate没有机会知道,如果不执行select,关系是否为null,因为关系中的表通常使用相同的主键

因此,如果您的关系不可为null,那么define optional=false,并且不会执行即时抓取。如果不是这样,你也可以用一对一的关系来代替


另请参见此

是否有任何可能的方法使B保持懒惰,并防止C和D获取数据?