[英]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提出了一种获取策略,该策略不在映射级别上起作用,而在请求级别上起作用。 因此,您仍然可以具有延迟加载映射,但在某些情况下会急于获取。
我并没有真正按照自己想要的方式解决它,但现在可以了。 看来,真的没有办法急切地加载实体,对此一无所知。 我们的问题是,该实体来自第三方Maven依赖项,并且不可更改且难以查找。 最后,我们构建一个entityProcessor,它采用延迟加载的实体并递归调用每个getter和子实体的所有getter。 如果我们可以控制实体,则下次我将使用FetchProfiles,否则,建议您实现clone()函数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.