Différence entre FetchType PARESSEUX et DÉSIREUX (Java Persistence API)?
Je suis un newbie de l'API Java Persistence et Hibernate.
Quelle est la différence entre FetchType.LAZY
et FetchType.DÉSIREUX
(Java Persistence API)?
- DÉSIREUX de chargement des collections signifie qu'ils sont récupérés entièrement au moment de leur parent est récupéré. Bien que DÉSIREUX de chargement, puis tous mon enfant est récupéré. L'enfant est récupéré dans le PersistentSet et PersistentList (ou PersistentBag), à l'intérieur de la persistance de Sac , il affiche une Liste de Tableau. Est-il correct??..
Vous devez vous connecter pour publier un commentaire.
Parfois, vous avez deux entités, il y a une relation entre eux. Par exemple, vous pourriez avoir une entité appelée Université et une autre entité appelée Étudiant.
L'Université entité peut avoir certaines propriétés de base tels que l'id, le nom, l'adresse, etc. ainsi que d'une propriété appelée étudiants:
Maintenant, lorsque vous chargez une Université à partir de la base de données, JPA charge son id, le nom et l'adresse de champs pour vous. Mais vous avez deux options pour les étudiants: pour le charger avec le reste des champs (c'est à dire avec impatience) ou pour le charger à la demande (c'est à dire paresseusement) lorsque vous appelez de l'université getStudents() la méthode.
Lorsque l'université a beaucoup d'étudiants, il n'est pas efficace pour charger l'ensemble de ses étudiants avec elle quand ils ne sont pas nécessaires. Donc, dans les autres cas, vous pouvez déclarer que vous voulez que les élèves être chargé lorsqu'ils sont réellement nécessaires. Ceci est appelé le chargement paresseux.
getStudents()
), mais parfois cela n'est pas possible, parce que le temps de cette méthode est appelée, la session est déjà fermé et l'entité détachée. De même, parfois, nous avons une architecture client/serveur (par exemple, Swing client/serveur JEE) et les entités/Dto sont transférées sur le fil pour le client et, de nouveau, le plus souvent dans ces scénarios de chargement paresseux ne fonctionne pas en raison de la façon dont les entités sont en série sur le fil.getStudents()
méthode pour la première fois, les résultats sont mis en cache? afin que je puisse accéder à ces résultats, plus rapidement la prochaine fois?Fondamentalement,
EAGER
chargement des collections signifie qu'ils sont récupérés entièrement au moment de leur parent est récupéré. Donc, si vous avezCourse
et il aList<Student>
, tous les élèves sont récupérés à partir de la base de données au moment de laCourse
est récupéré.LAZY
d'autre part, signifie que le contenu de laList
sont récupérés uniquement lorsque vous essayez d'y accéder. Par exemple, en appelantcourse.getStudents().iterator()
. L'appel à la méthode d'accès à l'List
va lancer un appel à la base de données pour récupérer les éléments. Ceci est mis en œuvre par la création d'un Proxy à travers leList
(ouSet
). Donc, pour votre plateau des collections, les types de béton ne sont pasArrayList
etHashSet
, maisPersistentSet
etPersistentList
(ouPersistentBag
)course.getStudents()
, il déclenche une requête SQL( vu que sur console). La paresse du type d'extraction aussi, la même chose se produit. Alors, Quelle est la différence??fetchtype = LAZY
celui par défaut même si vous essayez d'obtenir la collection avec le getter hibernete renvoyait un message d'erreur me disant qu'il ne peut pas évaluerJe peut prendre en compte les performances et l'utilisation de la mémoire. Une grande différence est que DÉSIREUX d'extraction stratégie permet d'utiliser les données extraites de l'objet session. Pourquoi?
Toutes les données sont récupérées lors de l'désireux marqué les données de l'objet lors de la session est connectée. Toutefois, en cas de paresseux stratégie de chargement, le chargement paresseux marqué l'objet n'a pas de récupérer des données si la session est déconnectée (après
session.close()
déclaration). Tout ce qui peut être fait par hibernate proxy. Désireux de stratégie permet aux données d'être toujours disponibles après la clôture de la session.Par défaut, pour l'ensemble de la collection et les objets de la carte la récupération de la règle est
FetchType.LAZY
et pour d'autres cas, il suit leFetchType.EAGER
politique.En bref,
@OneToMany
et@ManyToMany
relations ne pas extraire les objets associés (collecte et la carte) implicictly mais l'opération de récupération est en cascade à travers le champ en@OneToOne
et@ManyToOne
ceux.(avec l'aimable autorisation :- objectdbcom)
Selon mes connaissances, à la fois le type d'extraction dépend de votre exigence.
FetchType.LAZY
est à la demande (c'est à dire lorsque nous avons exigé de données).FetchType.EAGER
est immédiate (c'est à dire avant notre exigence entre nous sont inutilement de l'extraction de l'enregistrement)Les deux
FetchType.LAZY
etFetchType.EAGER
sont utilisés pour définir les par défaut fetch plan.Malheureusement, vous ne pouvez remplacer la valeur par défaut d'extraction plan pour le chargement différé. DÉSIREUX de récupération est moins flexible et peut conduire à de nombreux problèmes de performances.
Mon conseil est de retenir l'envie de faire de vos associations DÉSIREUX car la récupération est une requête responsabilité à temps. Donc toutes vos requêtes doivent utiliser le chercher directive, afin de récupérer uniquement ce qui est nécessaire pour la gestion de cas.
De la Javadoc:
E. g., désireux est plus proactif que paresseux. Paresseux ne se produit que lors de la première utilisation (si le fournisseur prend l'indice), alors qu'avec hâte les choses (en mai), de bénéficier d'une pré-cheveux.
La
Lazy
type d'Extraction est par défaut sélectionné par Hibernate, sauf si vous explicitement marqueEager
type d'Extraction. Pour être plus précis et concis, la différence peut être indiquée comme ci-dessous.FetchType.LAZY
= Cela ne prend pas en charge les relations à moins que vous l'appelez via la méthode get.FetchType.EAGER
= Charge de toutes les relations.Avantages et les Inconvénients de ces deux types d'extraction.
Lazy initialization
améliore les performances en évitant les calculs inutiles et de réduire les besoins en mémoire.Eager initialization
prend plus la consommation de mémoire et de vitesse de traitement est lent.Après avoir dit que, dépend de la situation soit l'un de ces initialisation peut être utilisé.
getMember
est appelé qui correspond exactement au nom du membre motif?Book.java
Subject.java
HibernateUtil.java
Main.java
Vérifier le récupérer() la méthode de Main.java. Quand nous arrivons à l'Objet, puis sa collection listBooks, annoté avec
@OneToMany
, sera chargé paresseusement. Mais, d'autre part, de Livres de l'association de la collecte sujet, annoté avec@ManyToOne
, les charges eargerly (par[default][1]
pour@ManyToOne
,fetchType=EAGER
). On peut changer le comportement en plaçant fetchType.DÉSIREUX sur@OneToMany
Subject.java ou fetchType.PARESSEUX sur@ManyToOne
dans Books.java.Source
@ombre portée si vous êtes en utilisant Hibernate, vous pouvez appeler
Hibernate.initialize()
lorsque vous appelez legetStudents()
méthode:PARESSEUX: Il récupère l'enfant entités paresseusement je.e au moment d'aller chercher de l'entité mère juste extrait proxy(créé par cglib ou tout autre utilitaire) de l'enfant entités et lorsque vous accédez à n'importe quelle propriété de l'entité enfant, alors il est effectivement récupérée par hibernate.
IMPATIENTS: il récupère l'enfant entités, de même que parent.
Pour mieux comprendre allez à la documentation Jboss ou vous pouvez utiliser
hibernate.show_sql=true
pour votre application et vérifiez les requêtes émises par la mise en veille prolongée.