3 votes

JPA ne charge pas tout avec empressement

J'ai un problème d'utilisation de JPA 1.0 via l'implémentation OpenJPA. Mon modèle de données se compose d'un voyage qui a une relation OneToMany avec un segment et une relation OneToMany avec un passager. Leg et Passenger ont une association dans PassengerLeg. Celle-ci est mappée comme une relation bidirectionnelle OneToMany/ManyToOne. J'ai donc essentiellement un diamant dans mon modèle de données. Si un voyage a 2 étapes et 3 passagers, il y aura 6 passengerLegs. Pour divers cas d'utilisation, j'ai besoin d'aller dans chaque direction à partir de chaque entité. Pour l'instant, lorsque j'essaie de tout charger rapidement, le champ de l'étape dans PassengerLeg est nul et je n'arrive pas à comprendre pourquoi. Voici une représentation sommaire de mes classes :

@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;

}

J'ai passé d'innombrables heures à lire la documentation et tout ce que j'ai pu trouver sur Google pour trouver la cause de ce problème, mais je n'ai pas eu de chance. Quelqu'un a-t-il une idée de ce qui pourrait causer cela ? Faites-moi savoir si vous avez besoin de plus d'informations sur les classes/annotations.

7voto

AmitD Points 12541

JPA ne charge jamais beaucoup de côtés avec empressement, car cette opération peut prendre du temps. Récupération par défaut Comme mentionné dans les spécifications JPA

  1. One To One --->Fetch Eager
  2. One To Many ---> Fetch Paresseux
  3. Beaucoup pour un---> aller chercher Eager
  4. Many To Many---> Fetch Paresseux

Je ne vous conseille pas non plus d'opter pour Eager fetch car c'est une opération lourde.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X