2015-05-28 41 views
3

我正在使用SpringBoot,当为AModel调用一个存储库时,即使我没有调用CModel或DModel,存储库也正在执行对BModel,CModel和DModel的查询。任何想法为什么会发生这种情况,以及如何防止它发生?具有Eager fetch Type属性的对象为该属性的延迟加载属性执行查询。为什么?

@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); 

回答

1

这里的原因是,当实体AModel包括实体BModel,又包括CModelDModel。它具有获取CModelDModel当取为AModel被调用,否则你的查询将无法完成如果CModelDModel对象不是牵强的,并且使fetchType为EagerAModel的全部目的将不见了。

+0

是否有任何可能的方式来保持B中偷懒,防止C和d从取? –

1

发生这种情况的原因是从BModel到CModel和DModel的onetoOne关系。

当你定义一个与FetchType.LAZY的关系时,那么hibernate需要用代理替代对象,这样当你第一次访问它时,它可以加载它。

现在,一对一的关系是可以为空的,hibernate没有机会知道,如果关系为null或没有执行select,导致关系中的表通常使用相同的主键。

因此,如果您的关系不可为空,那么定义optional = false并且不会进行预先抓取。如果不是这种情况,您也可以使用oneToMany关系。

参见本stackoverflow question