JPA不急于加载一切

时间:2012-03-14 22:17:23

标签: java jpa openjpa

我在通过OpenJPA实现利用JPA 1.0时遇到问题。我的数据模型包括一个与Leg有OneToMany关系的Trip和一个与Passenger的OneToMany关系。 Leg和Passenger在PassengerLeg中有一个关联。这被映射为双向OneToMany / ManyToOne。基本上我的数据模型中有一颗钻石。如果旅行有2条腿和3名乘客,将有6个乘客腿。对于各种用例,我需要从每个实体的每个方向。现在,当我试图急切地加载所有内容时,PassengerLeg中的leg字段将为null,我无法弄清楚原因。这是我班级的一个吝啬代表:

@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上可以找到的任何可能导致这种情况的任何内容,但我没有运气。任何人有任何想法会导致这种情况吗?如果您需要有关课程/注释的更多信息,请与我们联系。

1 个答案:

答案 0 :(得分:6)

JPA从不急切地加载许多方面,因为它可能是耗时的操作。默认提取正如JPA Specs

中所述
  1. One To One ---&gt; Fetch Eager
  2. 一对多---&gt;抓取懒惰
  3. 多对一---&gt;获取渴望
  4. 多对多---&gt;抓取懒惰
  5. 我也不建议你去Eager fetch,因为它是重度操作