【问题标题】:JPA Not Eagerly Loading EverythingJPA 不急于加载所有内容
【发布时间】:2012-03-31 10:54:23
【问题描述】:

我在通过 OpenJPA 实现利用 JPA 1.0 时遇到问题。我的数据模型包含一个与 Leg 具有 OneToMany 关系以及与 Passenger 具有 OneToMany 关系的 Trip。 Leg 和Passenger 在PassengerLeg 中有一个关联。这被映射为双向 OneToMany/ManyToOne。所以基本上我的数据模型中有一颗钻石。如果行程有 2 条腿和 3 名乘客,则将有 6 条乘客腿。对于各种用例,我需要从每个实体走向每个方向。现在,当我尝试急切地加载所有内容时,PassengerLeg 中的 leg 字段将为空,我不知道为什么。这是我的课程的简略表示:

@Entity
public class Trip {

  @OneToMany(mappedBy = "trip", fetch = FetchType.EAGER)
  private List<Leg> legs;

  @OneToMany(mappedBy = "trip", fetch = FetchType.EAGER)
  private List<Passenger> passengers;

}

@Entity
public class Leg {

  @ManyToOne
  @JoinColumn(name = "TRIP_ID")
  private Trip trip;

  @OneToMany(mappedBy = "leg", fetch = FetchType.EAGER)
  private List<PassengerLeg> passengers;

}

@Entity
public class Passenger {

  @ManyToOne
  @JoinColumn(name = "TRIP_ID")
  private Trip trip;

  @OneToMany(mappedBy = "passenger", fetch = FetchType.EAGER)
  private List<PassengerLeg> legs;

}

@Entity
public class PassengerLeg {

  @ManyToOne
  @JoinColumn(name = "LEG_ID")
  private Leg leg; //this will be null

  @ManyToOne
  @JoinColumn(name = "PASSENGER_ID")
  private Passenger passenger;

}

我花了无数时间阅读文档和在 Google 上可以找到的任何内容,以找出可能导致此问题的原因,但我没有任何运气。任何人有任何想法会导致这种情况吗?如果您需要有关类/注释的更多信息,请告诉我。

【问题讨论】:

  • 你不是在那些 OneToMany 注释中缺少mappedBy 吗?
  • 谢谢。我添加了在此示例中忘记的 mappedBy 属性,但在我的应用程序中。 OneToMany 注释上也缺少一个 fetch 属性。

标签: java jpa openjpa


【解决方案1】:

JPA 从不急切地加载多面,因为它可能是耗时的操作。默认提取如 JPA 规范中所述

  1. 一对一 --->Fetch Eager
  2. 一对多 ---> Fetch Lazy
  3. 多对一--->获取Eager
  4. 多对多--->懒惰获取

我也不建议你去 Eager fetch 因为它是繁重的操作

【讨论】:

  • 那么当我遇到这种需要遍历many-to-many的情况时,大家有没有建议如何处理呢?我无法想象急切的获取比获取我的基础对象并手动遍历它以检索所有对象要慢,因为我需要它们。更不用说,即使我明确地将其设置为渴望获取,它仍然不是渴望获取数据。
  • 在 EBJ QL 查询中显式使用联接,以便获取所需的数据。JPQL
  • 任何其他想法,因为您链接的网站说 JPA 1.0 无法执行在这种情况下需要的嵌套提取??
  • 视情况使用左连接或内连接。
猜你喜欢
  • 1970-01-01
  • 2019-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-10
  • 1970-01-01
  • 2013-10-07
相关资源
最近更新 更多