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

use*_*899 4 java hibernate

当我使用hibernate关系映射时

@OneToOne 
@oneToMany
@ManyToOne
Run Code Online (Sandbox Code Playgroud)

关系,它为每次获取创建多个查询.

任何人都可以帮助我理解关系如何运作.. ??

Dil*_*eep 15

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

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

选择

@OneToMany(mappedBy="tableName", cascade=CascadeType.ALL)
@Column(name="id") 
@Fetch(FetchMode.SELECT)
Run Code Online (Sandbox Code Playgroud)

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

加入

@OneToMany(mappedBy="tableName", cascade=CascadeType.ALL)
@Column(name="id")
@Fetch(FetchMode.JOIN) 
Run Code Online (Sandbox Code Playgroud)

这与SELECT获取策略类似,不同之处在于所有数据库检索都在JOIN提取中预先进行,而不像SELECT那样需要它.这可以成为重要的性能考虑因素.

子查询

 @OneToMany(mappedBy="tableName", cascade=CascadeType.ALL)
 @Column(name="id")
 @Fetch(FetchMode.SUBSELECT)
Run Code Online (Sandbox Code Playgroud)

触发了两个SQL.一个用于检索所有Parent,另一个在WHERE子句中使用SUBSELECT查询来检索具有匹配父ID的所有子项.

批量

@OneToMany(mappedBy="tableName", cascade=CascadeType.ALL)
@Column(name="id")
@@BatchSize(size=2)
Run Code Online (Sandbox Code Playgroud)

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

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

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


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

1. 立即取货 -

加载Parent时立即获取关联,集合或属性.(懒惰="假")

2. 懒人收集 -

当应用程序调用该集合上的操作时,将获取集合.(这是集合的默认值.(lazy ="true")

3." 非常懒 "的集合取物 -

根据需要从数据库访问集合的各个元素.除非绝对需要(适用于非常大的集合),否则Hibernate会尝试不将整个集合提取到内存中(lazy ="extra")

4. 代理提取 -

当在关联对象上调用除标识符getter之外的方法时,将获取单值关联.(懒惰="代理")

5." 无代理 "获取 -

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

6. 懒惰属性获取 -

访问实例变量时,将获取属性或单值关联.(懒惰="真")

一对多和多对多允许立即,懒惰,超级懒惰

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