【问题标题】:Model Class running Multiple Queries in Hibernate..!在 Hibernate 中运行多个查询的模型类..!
【发布时间】:2013-08-30 07:03:11
【问题描述】:

当我使用休眠关系映射时使用

@OneToOne 
@oneToMany
@ManyToOne

为每次提取建立多个查询的关系。

谁能帮我理解这些关系是如何运作的......??

【问题讨论】:

    标签: java hibernate


    【解决方案1】:

    Hibernate 关系适用于不同的 Fetch 策略..!!

    Hibernate 提供了 4 种检索数据的策略:

    选择

    @OneToMany(mappedBy="tableName", cascade=CascadeType.ALL)
    @Column(name="id") 
    @Fetch(FetchMode.SELECT)
    

    在此方法中触发了多个 SQL。第一个被解雇了 用于检索父表中的所有记录。剩下的是 为检索每个父记录的记录而被解雇。这基本上是 N+1 问题。第一个查询从数据库中检索 N 条记录,在 本例 N 父记录。对于每个父母,一个新的查询检索 孩子。因此,对于 N 个 Parent,N 个查询从 子表。

    加入

    @OneToMany(mappedBy="tableName", cascade=CascadeType.ALL)
    @Column(name="id")
    @Fetch(FetchMode.JOIN) 
    

    这类似于 SELECT 提取策略,除了所有 与 SELECT 不同,数据库检索在 JOIN fetch 中预先进行 它在需要的基础上发生。这可能成为一个重要的 性能考虑。

    SUBSELECT

     @OneToMany(mappedBy="tableName", cascade=CascadeType.ALL)
     @Column(name="id")
     @Fetch(FetchMode.SUBSELECT)
    

    两个 SQL 被触发。一个检索所有 Parent ,第二个使用 WHERE 子句中的 SUBSELECT 查询以检索所有具有 匹配父 ID。

    批处理

    @OneToMany(mappedBy="tableName", cascade=CascadeType.ALL)
    @Column(name="id")
    @@BatchSize(size=2)
    

    批量大小映射到检索其子代的父代的数量。 所以我们可以指定一次要获取的记录数。但是 将执行多个查询。!!

    一对多和多对多允许 - 加入、选择和子选择

    多对一和一对一允许 - 加入和选择


    Hibernate 还区分(何时获取关联)

    1.立即获取 -

    立即获取关联、集合或属性,当 父级已加载。 (懒惰=“假”)

    2.延迟集合抓取 -

    当应用程序调用一个操作时,会获取一个集合 那个集合。 (这是集合的默认设置。(lazy=“true”)

    3."Extra-lazy" 集合抓取 -

    从数据库中访问集合的各个元素 如所须。 Hibernate 尝试不将整个集合提取到 内存,除非绝对需要(适用于非常大的集合) (懒惰=“额外”)

    4.代理获取 -

    当方法不是 在关联对象上调用标识符 getter。 (懒惰=“代理”)

    5."无代理"获取 -

    当实例变量为 访问。与代理获取相比,这种方法不那么懒惰。(lazy="no-proxy")

    6.惰性属性获取 -

    当实例获取属性或单值关联时 变量被访问。 (懒惰=“真”)

    一对多和多对多允许 Immediate、Layzy、Extra Lazy

    多对一和一对一允许立即代理,无代理

    【讨论】:

    • 感谢您的帮助。 :)
    猜你喜欢
    • 1970-01-01
    • 2012-04-28
    • 2020-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-27
    • 2011-09-14
    • 2023-03-15
    相关资源
    最近更新 更多