当前位置: 首页 > 面试题库 >

在Hibernate中运行多个查询的模型类。

郭翰翮
2023-03-14
问题内容

当我使用hibernate关系映射时

@OneToOne 
@oneToMany
@ManyToOne

每次获取时都会关联多个查询。

谁能帮助我了解关系的运作方式?


问题答案:

hibernate关系适用于不同的提取策略.. !!

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

选择

@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)

批处理大小映射到检索其子级的父级数。因此我们可以指定一次要获取的记录数,但是将执行多个查询!

一对多和多对多允许-连接,选择和子选择

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

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

1. 立即提取 -

加载父项后,将立即获取关联,集合或属性。(惰性=“假”)

2. 延迟集合获取 -

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

3.“ 超懒惰 ”集合的获取-

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

4. 代理获取 -

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

5.“ 无代理 ”获取-

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

6. 懒惰的 属性获取-

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

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

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



 类似资料:
  • 问题陈述:在JPA hibernate中,我执行了一个方法

  • 在Crystal Reports中,我使用以下查询(针对Oracle数据库)为报表中的单个字段生成数据: 这可以很好地工作,并基于提供的{HB_As_At_Date}(the{?}语法是Crystal将参数值嵌入SQL(SQL)的方法。不过,上述查询的内容不是我的问题——我想做的是在几个不同的日期重复运行它,并将输出输入Crystal以供在报告中使用。 假设我希望在9月的每个星期一运行这个查询,我

  • 问题内容: 我们正在尝试将包含多个插入语句的SQL文件作为一个查询运行,但是当任何一个语句包含错误时,它似乎都会失败。 MySQLd配置: Python代码: 预期结果:打印两次“抛出异常”和“回滚”。 使用MySQL-python 1.2.4的实际结果: 是什么赋予了?我们是否真的必须解析SQL以拆分语句(需要进行所有转义和引号处理)才能在多个s中运行它们? 问题答案: 显然,在(aka。)中无

  • 所以整个问题是如何在给定的数据集中查询命名模型的组合。

  • 问题内容: 我想在hibernateHql的同一查询中执行多个更新语句。如下所示: 在同一调用中,我想更新表1中的记录并从表2中删除记录。 那可能吗? 问题答案: 简而言之,您所看到的就像是JDBC中的批处理。Hichnate没有为批量更新查询提供Thich,并且我怀疑是否会为Hibernate考虑它。 根据我过去的经验,HQL的批处理功能在现实生活中很少有用。在SQL + JDBC中有用但在HQ

  • 问题内容: 我正在使用Hibernate 3.1.1,尤其是我正在使用HQL查询。 根据文档,Hibernate的查询是多态的: 像:这样的查询不仅返回的实例,还返回像的子类的实例。 如何查询Cat的实例,但不查询其任何子类的实例? 我希望能够做到而不必明确提及每个子类。 我知道以下选项,但并不令人满意: 查询后手动过滤实例,或者: 在鉴别符列上手动添加WHERE子句。 Hibernate允许用户