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

忽略关系中的FetchType.EAGER

花阳秋
2023-03-14
问题内容

在大型应用程序中,我与EAGER的关系存在问题。此应用程序中的某些实体EAGER与其他实体具有关联。这在某些功能上成为“毒药”。

现在,我的团队需要优化此功能,但是 我们无法将访存类型更改为LAZY ,因为我们需要重构整个应用程序。

所以,我的问题是:是否有一种方法可以执行特定的查询而忽略我返回的实体中的EAGER关联?

示例:当我有这个实体Person时,我在查询以查找Person时不带地址列表。

@Entity
public class Person {

  @Column
  private String name;

  @OneToMany(fetch=FetchType.EAGER)
  private List<String> address;

}

Query query = EntityManager.createQuery("FROM Person person");
//list of person without the address list! But how???
List<Person> resultList = query.getResultList();

谢谢!

更新

我发现的唯一方法是不返回实体,仅返回实体的某些字段。但是我想找到一个可以返回实体(在我的示例中为Person实体)的解决方案

我在想是否有可能在Hibernate中两次映射同一张表。这样,我可以在没有EAGER关联的情况下映射同一张表。这在某些情况下会帮助我…


问题答案:

这些年来,在Hibernate上 尚无法
覆盖EAGER映射。从最新的Hibernate文档(5.3.10.Final):

尽管JPA标准指定您可以在运行时使用javax.persistence.fetchgraph提示覆盖EAGER提取关联,但是当前Hibernate并未实现此功能,
因此无法懒惰地提取EAGER关联 。有关更多信息,请查看
HHH-8776 Jira问题。

当执行JPQL查询时,如果省略EAGER关联,则Hibernate将为需要急切获取的每个关联发出辅助选择,这可能导致dto N + 1查询问题。

因此,最好使用LAZY关联,并且仅在每个查询的基础上热切地获取它们。

和:

EAGER的获取策略 不能在每个查询的基础上被覆盖
,因此即使您不需要该关联,也总是可以对其进行检索。此外,如果您忘记在JPQL查询中加入FETCH
EAGER关联,Hibernate将使用辅助语句对其进行初始化,这反过来可能导致N + 1查询问题。



 类似资料:
  • 在我的夸克应用程序中,我在一个单独的gradle项目/模块中实现了存储库,部分原因是我希望能够确保单元测试不使用数据库等。 问题是,如果我想在测试中使用任何注入的依赖项,我需要使用@QuarkusTest,然后构建或启动确保满足所有依赖项。 有没有一种方法不涉及模仿每一个外部依赖,例如。? < li >运行测试时,不要在构建或启动期间强制依赖关系,而是在运行时让它出错(如果被访问)。 < li >

  • 我使用hibernate 5作为JPA实现,我有一个@OneToMany双向关系的问题。 这些是我的实体: 我希望这种关系在两个方向上都是惰性的,因为我想通过fetch JOIN手动获取数据,如下面的查询: 但我的问题是hibernate忽略了@ManyToOne(fetch=FetchType.LAZY),因此Jackson由于引用链的无限递归(StackOverflowerr)而中断,如下所示

  • 问题内容: 我正在一个实体框架项目。我想序列化一堆实体类实例。我将它们绑定到一个容器类中: Etcetera …这是我尝试序列化的此类的一个实例。我希望JSON.NET序列化每个实际上是基础数据库中的列的每个实体类实例的成员。我甚至不想尝试序列化对象引用。 特别是,我的实体类具有虚拟成员,这些成员使我能够编写可导航所有实体关系的C#代码,而不必担心实际的键值,联接等问题,并且我希望JSON.NET

  • 我创建了一个使用标记框下拉列表的web应用程序。这在除Chrome浏览器(版本21.0.1180.89)之外的所有浏览器中都非常有效。 尽管字段和字段都具有属性,但Chrome坚持显示该字段以前输入项的下拉历史记录,这将删除标记框列表。

  • 问题内容: 我正在开发一个使用Spring-boot,关系数据库和Elasticsearch的应用程序。 我在代码的2个不同位置使用JSON序列化: 在REST API的响应中。 当代码与Elasticsearch交互时。 我在Elasticsearch中需要一些属性,但我想向应用程序用户隐藏(例如,来自关系数据库的内部ID)。 这是一个实体的例子: 问题 :当对象持久化在Elasticsearc

  • 我有一个作为字符串接收的HTML文档,然后使用jSoup解析它。此HTML文档(字符串形式)包含