java - JPA 不急于加载所有内容

标签 java jpa openjpa

我在通过 OpenJPA 实现利用 JPA 1.0 时遇到问题。我的数据模型由一个 Trip 组成,它与 Leg 具有 OneToMany 关系,与 Passenger 具有 OneToMany 关系。 Leg 和 Passenger 在 PassengerLeg 中有关联。这被映射为双向 OneToMany/ManyToOne。所以基本上我的数据模型中有一颗钻石。如果一个行程有 2 条腿和 3 名乘客,那么就会有 6 个 passengerLegs。对于各种用例,我需要从每个实体的每个方向走。现在,当我尝试急切加载所有内容时,PassengerLeg 中的 leg 字段将为空,我无法弄清楚原因。这是我的类(class)的简略表示:

@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 上可以找到的任何内容,以找出可能导致此问题的原因,但我没有任何运气。任何人有任何想法会导致这种情况吗?如果您需要有关类/注释的更多信息,请告诉我。

最佳答案

JPA 永远不要急切地加载多边,因为这可能是一项耗时的操作。默认获取如 JPA 规范中所述

  1. 一对一--->获取渴望
  2. 一对多 ---> 延迟获取
  3. 多对一--->获取Eager
  4. 多对多--->延迟获取

另外,我也不建议你去使用 Eager fetch,因为它是繁重的操作

关于java - JPA 不急于加载所有内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9711148/

相关文章:

java - JPA @OneToOne 或 @ManyToOne 两个连接列的延迟获取

java - JPA Merge 和 Remove 不会同时级联到子对象

java - 打开 jpa - 使用 log4j.xml 捕获日志记录

java - 如何将javac的显示语言改为英文?

java - 我需要为图像设置准确的位置,但它没有移动?

java - 查看特定方法的调用堆栈

jakarta-ee - 避免容器管理的 EntityManager 超时

java - 与额外列的多对多关联

java - JPA:无法反序列化

java - 用作 websphere 8 应用程序的 -javaagent 的 openjpa jar 位于哪里?