在 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 中运行多个查询的模型类..!的主要内容,如果未能解决你的问题,请参考以下文章