有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

尽管初始化很慢,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


共 (2) 个答案

  1. # 1 楼答案

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

  2. # 2 楼答案

    看: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

    即使已在lazy中初始化,也会返回已加载(渴望)的mate和Kittes

    编辑: 或者您可以使用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