繁体   English   中英

尽管初始化延迟,但仍渴望加载?

[英]Eager loading despite Lazy Initialization?

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

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

(我无法更改)。

那些被延迟加载(默认情况下,我认为),这很好,我们不想更改此设置。 现在,我们遇到这种情况,我们希望通过其ID急切地找到整个实体以将其返回。

我发现了很多更改实体的建议,并且有关紧急加载或延迟加载的讨论更好,但这对我没有帮助,因为该实体对我们来说是遥不可及的。 有没有一种方法可以执行此操作,而无需更改实体并且不必调用每个可能的getter来初始化惰性实体(因为这些实体太多)? 因此,例如, 问题24573877的答案对我不起作用。

基本上,我想说“渴望加载实体,但是只加载一次”。 目前,我只是在做return em.find(MyEntity.class, contractId) (我可以更改此设置)。

感谢和问候Urr4

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

章节:14.3。 协会和加盟

“获取”联接允许使用单个选择将值的关联或集合及其父对象初始化。 这在集合的情况下特别有用。 它有效地覆盖了关联和集合的映射文件的外部联接和惰性声明。 有关更多信息,请参见第19.1节“获取策略”。

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

以这个查询为例:

从Cat中获取,作为cat内部联接获取cat.mate左联接获取cat.kittens

会返回带有已加载的伴侣和小猫的猫(渴望),即使它们已在懒惰中初始化

编辑:或者,您可以使用获取配置文件:

为了减轻这些负担,Hibernate提出了一种获取策略,该策略不在映射级别上起作用,而在请求级别上起作用。 因此,您仍然可以具有延迟加载映射,但在某些情况下会急于获取。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM