尽管初始化很慢,java还是急于加载?
我们有一个实体,它有很多的多个一个、一个一个等的关系,它们自身又有一些关系。 比如
@OneToMany(targetEntity = Season.class, cascade = {
CascadeType.ALL
})
@JoinColumn(name = "SEASON_ID")
public List<Season> getSeasons(){...}
(我无法改变这一点)
这些都是惰性加载的(我认为默认情况下),这很好,我们不想改变这一点。 现在我们有一个案例,我们希望通过它的id找到整个实体,然后返回它
我发现了很多改变实体的建议,并且讨论了是快速加载还是延迟加载更好,这在这一点上对我没有帮助,因为我们无法接触到实体。 有没有一种方法可以做到这一点,而不必更改实体,也不必调用所有可能的getter来初始化惰性实体(因为它们太多)? 例如,对Question 24573877的回答对我来说并不适用
基本上我想说的是“急切地加载实体,但就这一次”。
目前我正在做return em.find(MyEntity.class, contractId)
(我可以改变这个)
谢谢和问候 Urr4
# 1 楼答案
我并没有真正按照我想要的方式解决它,但它现在起作用了。 看起来,真的没有办法急切地加载一个实体,你对它一无所知。 我们的问题是,该实体来自第三方Maven依赖关系,不可更改且难以调查。 最后,我们构建了一个entityProcessor,它接受延迟加载的实体,并递归调用每个getter和子实体的所有getter。 如果我们控制了一个实体,下次我将使用FetchProfiles,否则,我建议实现一个clone()函数
# 2 楼答案
看:http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/queryhql.html
第14.3章。协会和加入
您必须编写查询,而不是使用em.find
例如这个查询:
即使已在lazy中初始化,也会返回已加载(渴望)的mate和Kittes
编辑: 或者您可以使用fetch profil:
看:https://blog.frankel.ch/hibernate-hard-facts-part-6