5

当我使用休眠关系映射时

@OneToOne 
@oneToMany
@ManyToOne

关系它为每次获取进行多个查询。

任何人都可以帮助我了解这些关系是如何运作的..??

4

1 回答 1

17

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

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

选择

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

在此方法中,触发了多个 SQL。第一个被触发以检索父表中的所有记录。其余的被触发以检索每个父记录的记录。这基本上是 N+1 问题。第一个查询从数据库中检索 N 条记录,在本例中为 N 条父记录。对于每个父项,一个新查询检索子项。因此对于 N 个 Parent,N 个查询从 Child 表中检索信息。

加入

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

这类似于 SELECT fetch 策略,除了所有数据库检索都在 JOIN fetch 中预先发生,这与 SELECT 中它根据需要发生不同。这可能成为重要的性能考虑因素。

子选择

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

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

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

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

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

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


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

1.立即获取-

加载 Parent 时立即获取关联、集合或属性。(懒惰=“假”)

2.懒收集——

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

3.“超懒”集合抓取——

根据需要从数据库中访问集合的各个元素。Hibernate 尽量不将整个集合提取到内存中,除非绝对需要(适用于非常大的集合)(lazy=“extra”)

4.代理获取-

当在关联对象上调用标识符 getter 以外的方法时,将获取单值关联。(懒惰=“代理”)

5.“无代理”获取——

访问实例变量时获取单值关联。与代理获取相比,这种方法不那么懒惰。(lazy=“no-proxy”)

6.属性获取——

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

一对多和多对多允许立即,懒惰,额外懒惰

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

于 2013-09-04T04:26:52.647 回答