0

我们有一个实体,它有很多 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

4

2 回答 2

2

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

章:14.3。关联和连接

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

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

例如这个查询:

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

将返回 cat 已经加载(eager)的 mate 和 kittens,即使它们已在惰性中初始化

编辑: 或者您可以使用 fetch profile :

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

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

于 2015-10-23T15:15:54.680 回答
0

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

于 2015-11-12T09:14:12.770 回答