尽管懒惰初始化,仍然急切加载?

时间:2015-10-23 14:59:50

标签: java hibernate lazy-evaluation eager

我们有一个实体,它有很多ManyToOne,OneToOne等关系,它们本身又有一些关系。 例如

@OneToMany(targetEntity = Season.class, cascade = {
    CascadeType.ALL
})
@JoinColumn(name = "SEASON_ID")
  public List<Season> getSeasons(){...}

(我无法改变这一点)。

这些是懒惰地加载(默认情况下我认为)哪个好,我们不想改变它。 现在我们有了这个案例,我们希望通过它的id来急切地找到整个实体来返回它。

我发现了许多改变实体的建议,关于更热切或懒惰加载的讨论更好,这对我来说没有帮助,因为实体对我们来说是遥不可及的。 有没有办法做到这一点,不需要更改实体,也不必调用每个可能的getter来初始化惰性实体(因为它们太多了)? 例如,Question 24573877的答案对我不起作用。

基本上我想说&#34;急切地加载实体,但这只是一次&#34;。 目前我正在做return em.find(MyEntity.class, contractId)(我可以改变这个)。

谢谢和问候 Urr4

2 个答案:

答案 0 :(得分:2)

看看:http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/queryhql.html

章节:14.3。关联和联接

  

A&#34; fetch&#34; join允许使用单个select将关联或值集合与其父对象一起初始化。这在集合的情况下特别有用。它有效地覆盖了关联和集合的映射文件的外连接和延迟声明。有关更多信息,请参见第19.1节“获取策略”。

您已编写查询而不是使用em.find。

例如:

  

来自Cat作为猫       内联接获取cat.mate       left join fetch cat.kittens

将返回带有已经加载(急切)的伴侣和小猫的猫,即使它们已经在懒惰中初始化

修改: 或者你可以使用fetch profil:

  

为了缓解这些问题,Hibernate提出了一种获取策略,该策略不在映射级别上工作,而是在请求级别上工作。因此,您仍然可以使用延迟加载映射,但在某些情况下需要提取。

看看:https://blog.frankel.ch/hibernate-hard-facts-part-6

答案 1 :(得分:0)

我没有按照我想要的方式解决它,但它现在有效。 看来,真的没有办法急切地加载一个实体,你什么都不知道。 我们的问题是,该实体来自第三方Maven依赖,并且不可更改且难以查看。 最后,我们构建了一个entityProcessor,它接受了延迟加载的实体,并以递归方式调用每个getter和子实体的所有getter。 如果我们控制一个实体,下次我会使用FetchProfiles,否则,我建议实现一个clone()函数。