【问题标题】:How lazy loading works for collection of objects?延迟加载如何用于对象集合?
【发布时间】:2020-06-13 09:33:39
【问题描述】:

我有一对多关联,并且 FetchType 是 LAZY。
我知道休眠将为延迟加载的实体创建代理对象。但是如果子实体是 Collection 类型,它是如何工作的?它会为每个集合对象创建代理吗?
示例:-

 public class Company {
    private String name;    

    @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY)
    private Set<Employee> employees;
 } 

【问题讨论】:

    标签: java hibernate jpa set hibernate-mapping


    【解决方案1】:

    为字段创建代理,这意味着employees 将成为集合的代理。现在如果你尝试遍历集合的元素,基本上有两种可能:

    1. 如果您不在事务中,LazyInitializationException 将被抛出。这很好,因为您知道,您必须急切地获取它们就是这个查询。
    2. 如果您在事务中,那么休眠将获取您正在迭代的每个元素。这是一个巨大的性能开销,因为您需要触发一个查询来获取父实体,然后为每个子实体执行一个查询。如果有N 孩子,则需要对数据库进行N+1 调用,这也称为N + 1 select problem

    【讨论】:

    • 感谢您的回复。我想知道“员工”集合的确切代理实现。
    • @RohitJadhav 休眠未指定“确切实现”。它可能会因版本而异。它甚至可能在同一程序的两次运行之间发生变化。它可以是硬编码实现,可以是代理,甚至可以是运行时代码生成...甚至可以通过带有侦听器的 your 配置进行更改。因此,出于纯粹的好奇,您必须检查 hibernate 的源代码和您的确切 SessionFactory 配置。但对于任何其他目的,您最好只限于实现尊重集合接口的约定这一事实。
    猜你喜欢
    • 2020-01-23
    • 2014-11-20
    • 2016-11-25
    • 1970-01-01
    • 2016-12-21
    • 1970-01-01
    • 2011-02-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多