Question Différence entre FetchType LAZY et EAGER dans Java Persistence API?


Je suis un débutant à Java Persistence API et Hibernate.

Quelle est la différence entre FetchType.LAZY et FetchType.EAGER dans l'API Java Persistence?


407
2018-06-07 15:28


origine


Réponses:


Parfois, vous avez deux entités et il existe une relation entre elles. Par exemple, vous pourriez avoir une entité appelée Université et une autre entité appelée Étudiant.

L'entité Université peut avoir des propriétés de base telles que l'id, le nom, l'adresse, etc. ainsi qu'une propriété appelée étudiants:

public class University {
 private String id;
 private String name;
 private String address;
 private List<Student> students;

 // setters and getters
}

Maintenant, lorsque vous chargez une université à partir de la base de données, JPA charge ses champs id, nom et adresse pour vous. Mais vous avez deux options pour les étudiants: le charger avec le reste des champs (c'est-à-dire avec empressement) ou le charger à la demande (c'est-à-dire paresseusement) lorsque vous appelez la méthode getStudents () de l'université.

Lorsqu'une université a beaucoup d'étudiants, il n'est pas efficace de charger tous ses étudiants quand ils ne sont pas nécessaires. Donc, dans de tels cas, vous pouvez déclarer que vous voulez que les étudiants soient chargés quand ils en ont réellement besoin. Ceci s'appelle le chargement paresseux.


796
2018-06-07 15:53



Fondamentalement,

LAZY = fetch when needed
EAGER = fetch immediately

221
2018-06-07 15:31



EAGER le chargement des collections signifie qu'elles sont entièrement récupérées au moment de l'extraction de leur parent. Donc si vous avez Course et il a List<Student>, tous les étudiants sont récupérés de la base de données au moment où le Course est récupéré.

LAZY d'autre part signifie que le contenu de la List sont récupérées uniquement lorsque vous essayez d'y accéder. Par exemple, en appelant course.getStudents().iterator(). Appeler une méthode d'accès sur le List lancera un appel à la base de données pour récupérer les éléments. Ceci est implémenté en créant un proxy autour du List (ou Set). Donc, pour vos collections paresseuses, les types concrets ne sont pas ArrayList et HashSet, mais PersistentSet et PersistentList (ou PersistentBag)


54
2018-06-07 15:54



Je peux envisager l'utilisation des performances et de la mémoire. Une grande différence est que la stratégie EAGER fetch permet d'utiliser l'objet de données récupéré sans session. Pourquoi?
Toutes les données sont récupérées lorsque des données marquées sont désirées dans l'objet lorsque la session est connectée. Cependant, en cas de stratégie de chargement paresseux, le chargement par défaut d’un objet marqué ne permet pas de récupérer les données si la session est déconnectée (après session.close() déclaration). Tout ce qui peut être fait par un proxy hibernate. La stratégie Eager permet aux données d'être toujours disponibles après la fermeture de la session.


13
2018-01-29 02:39



Par défaut, pour tous les objets de collection et de carte, la règle de récupération est FetchType.LAZY et pour d'autres cas, il suit le FetchType.EAGER politique.
En bref, @OneToMany et @ManyToMany relations ne récupère pas implicitement les objets associés (collection et carte) mais l'opération de récupération est effectuée en cascade dans le champ @OneToOne et @ManyToOne ceux

(avec la permission de: - objectdbcom)


11
2017-07-22 13:21



À ma connaissance, les deux types de fetch dépendent de vos besoins.

FetchType.LAZY est sur demande (c'est-à-dire lorsque nous avons demandé les données).

FetchType.EAGER est immédiat (c'est-à-dire avant que notre exigence ne vienne, nous cherchons inutilement le disque)


9
2018-03-11 12:20



Du Javadoc:

La stratégie EAGER est une exigence pour l'exécution du fournisseur de persistance que les données doivent être extraites avec empressement. La stratégie LAZY est une indication pour le moteur d'exécution du fournisseur de persistance que les données doivent être récupérées paresseusement lors de leur première utilisation.

Par exemple, désireux est plus proactif que paresseux. La paresse ne se produit que lors de la première utilisation (si le fournisseur prend l'indice), tandis qu'avec des choses désireuses (peut-être), elle est pré-récupérée.


6
2018-06-07 15:31