尽管有延迟初始化,但还是急于加载?

Eager loading despite Lazy Initialization?

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

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

(我不能改变这个)。

这些是延迟加载的(我认为默认情况下)这很好,我们不想改变它。 现在我们有这种情况,我们想通过它的 id 急切地找到整个实体 return 它。

我发现了很多更改实体的建议和关于急切加载或延迟加载哪个更好的讨论,这在这一点上对我没有帮助,因为实体对我们来说遥不可及。 有没有一种方法可以做到这一点,而无需更改实体,也不必调用所有可能的 getter 来初始化惰性实体(因为它们太多了)? 例如,Question 24573877 的答案对我不起作用。

基本上我想说"load the entity eagerly, but just this once"。 目前我只是在做 return em.find(MyEntity.class, contractId)(我可以改变这个)。

感谢和问候 Urr4

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

章节:14.3。协会和加入

A "fetch" join allows associations or collections of values to be initialized along with their parent objects using a single select. This is particularly useful in the case of a collection. It effectively overrides the outer join and lazy declarations of the mapping file for associations and collections. See Section 19.1, “Fetching strategies” for more information.

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

例如这个查询:

from Cat as cat inner join fetch cat.mate left join fetch cat.kittens

will return cat with mate 和 kittens 已经加载(急切),即使它们已经在 lazy

中初始化

编辑: 或者你可以使用 fetch profil :

In order to mitigate these, Hibernate propose a fetch strategy that works not on the mapping level, but on the request level. Thus, you can still have lazy loading mappings but eager fetching in some cases.

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

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