hibernate关系适用于不同的提取策略.. !!
@OnetoMany(mappedBy='tableName', cascade=CascadeType.ALL)@Column(name='id') @Fetch(FetchMode.SELECT)
在此方法中,将触发多个sql。为检索父表中的所有记录而触发第一个。其余的被解雇以获取每个父记录的记录。这基本上是N +1问题。第一个查询从数据库中检索N条记录,在本例中为N条父记录。对于每个父级,一个新查询将检索子级。因此,对于N个父对象,N个查询从子表中检索信息。
@OnetoMany(mappedBy='tableName', cascade=CascadeType.ALL)@Column(name='id')@Fetch(FetchMode.JOIN)
这与SELECT提取策略相似,不同之处在于所有数据库检索均在JOIN提取中预先进行,而SELECT则是根据需要进行的。这可能成为重要的性能考虑因素。
@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)
批处理大小映射到检索其子级的父级数。因此我们可以指定一次要获取的记录数,但是将执行多个查询!
1. -
加载父项后,将立即获取关联,集合或属性。(惰性=“假”)
2. -
当应用程序对该集合调用操作时,将获取一个集合。(这是集合的默认设置。(lazy =“ true”))
3.“ ”集合的获取-
可以根据需要从数据库中访问集合的各个元素。除非绝对必要,否则Hibernate尝试不将整个集合获取到内存中(适用于非常大的集合)(lazy =“extra”)
4. -
当在关联对象上调用除标识符getter之外的方法时,将获取单值关联。(懒惰=“代理”)
5.“ ”获取-
访问实例变量时,将获取单值关联。与代理获取相比,此方法比较懒惰。(lazy =“ no-proxy”)
6. 属性获取-
访问实例变量时,将获取属性或单值关联。(懒惰=“ true”)
解决方法当我使用hibernate关系映射时
@OneToOne @oneToMany@ManyToOne
每次获取时都会关联多个查询。
谁能帮助我了解关系的运作方式?