JPA не торопится загружать все - PullRequest
3 голосов
/ 15 марта 2012

У меня проблема с использованием JPA 1.0 через реализацию OpenJPA.Моя модель данных состоит из поездки, которая имеет отношения OneToMany с Leg и OneToMany с пассажиром.У Ноги и Пассажира есть связь в PassengerLeg.Это отображается как двунаправленный OneToMany / ManyToOne.По сути, в моей модели данных есть бриллиант.Если поездка имеет 2 ноги и 3 пассажира, будет 6 пассажирских ног.Для различных случаев использования мне нужно идти в каждом направлении от каждой сущности.Прямо сейчас, когда я пытаюсь загрузить все с нетерпением, поле ноги в PassengerLeg будет нулевым, и я не могу понять, почему.Вот скудное представление моих классов:

@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 Ответ

6 голосов
/ 24 марта 2012

JPA Никогда не загружайте много сторон с нетерпением, так как это может занять много времени.Выборка по умолчанию Как упомянуто в Спецификациях JPA

  1. Один к одному ---> Получить с нетерпением
  2. Один ко многим ---> Выбрать ленивый
  3. Много к одному-> fetch Eager
  4. Many To Many ---> Fetch Lazy

также я не советую вам идти на Eager fetch, поскольку это тяжелая операция

...