在 Hibernate 中运行多个查询的模型类..!

Posted

技术标签:

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

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

@OneToOne 
@oneToMany
@ManyToOne

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

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

【问题讨论】:

【参考方案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

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

【讨论】:

感谢您的帮助。 :)

以上是关于在 Hibernate 中运行多个查询的模型类..!的主要内容,如果未能解决你的问题,请参考以下文章

hibernate中,怎么样同时查询多个表,连接查询

如何在同一个 Hibernate 事务中运行原生 SQL 查询?

使用 HQL 查询的 Hibernate 批量更新

Hibernate 映射及查询

JavaEE学习笔记之SSH—Hibernate

hibernate关联映射