当我使用休眠关系映射时
@OneToOne
@oneToMany
@ManyToOne
关系它为每次获取进行多个查询。
任何人都可以帮助我了解这些关系是如何运作的..??
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.懒属性获取——
访问实例变量时会获取属性或单值关联。(懒惰=“真”)
一对多和多对多允许立即,懒惰,额外懒惰
多对一和一对一允许立即代理,无代理