模型类在Hibernate中运行多个查询..!
当我使用hibernate关系映射时
@OneToOne @oneToMany @ManyToOne
关系,它为每次获取创建多个查询。
任何人都可以帮助我理解关系如何运作.. ??
Hibernate关系适用于不同的获取策略.. !!
Hibernate提供了4种检索数据的策略:
选择
@OneToMany(mappedBy="tableName", cascade=CascadeType.ALL) @Column(name="id") @Fetch(FetchMode.SELECT)
在此方法中,有多个SQL被触发。 触发第一个用于检索Parent表中的所有记录。 其余的被触发以检索每个父记录的记录。 这基本上是N + 1问题。 第一个查询从数据库中检索N个记录,在本例中为N个父记录。 对于每个Parent,新查询将检索Child。 因此,对于N Parent,N查询从Child表中检索信息。
加入
@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)
批量大小映射到其子项被检索的父级数。 所以我们可以指定一次获取的记录数。但是将执行多个查询。!!
一对多和多对多允许 – 加入,选择和子选择
多对一和一对一允许 – 加入和选择
Hibernate也区分(何时获取关联)
1. 立即取物 –
加载Parent时立即获取关联,集合或属性。 (懒惰=“假”)
2. 懒人collections –
当应用程序调用该集合上的操作时,将获取集合。 (这是集合的默认值。(lazy =“true”)
3.“ 非常懒 ”的集合取物 –
根据需要从数据库访问集合的各个元素。 除非绝对需要(适用于非常大的集合),否则Hibernate会尝试不将整个集合提取到内存中(lazy =“extra”)
4. 代理提取 –
当在关联对象上调用除标识符getter之外的方法时,将获取单值关联。 (懒惰=“代理”)
5.“ 无代理 ”取得 –
访问实例变量时,将获取单值关联。 与代理提取相比,这种方法不那么懒惰。(lazy =“no-proxy”)
6. 懒惰属性获取 –
访问实例变量时,将获取属性或单值关联。 (懒惰=“真”)
一对多和多对多允许立即,懒惰,超级懒惰
多对一和一对一允许立即代理,无代理
- Hibernateexception处理
- 如何使用hibernate条件实现使用内部联接对象选择查询
- Hibernate – 从多个表到一个对象的复杂查询
- jpa 2 hibernate limit(最大结果)到CriteriaQuery
- Hibernate @OneToMany抛出MySQLSyntaxErrorException:您的SQL语法中有错误
- 一个事务中的Hibernate和JDBC
- Hibernatevalidation失败时出现意外的UnsupportedOperationException
- 启用Hibernate日志记录
- org.hibernate.InstantiationException:没有实体的默认构造函数:: principal.Cliente