J’avais l’impression que session.load()
charge l’object proxy dans le cache alors que session.get()
frappe toujours la firebase database, mais je suis confus après avoir visionné une vidéo JavaBrains.
Selon cette vidéo, lorsque nous appelons la méthode get ci-dessous, il charge l’object proxy de UserDetails
dans la mémoire.
user = (UserDetails) session.get(UserDetails.class, 1);
La structure de UserDetails
est
Dans la section des commentaires, un gars a commenté:
il n’y a pas de proxy de la classe User, mais l’object proxy de la collection est créé.
Maintenant, il y a deux questions ici.
1er: Relatif à l’extraction de stratégies et à la création d’objects proxy dans les cas de session.load () et session.get () auxquels j’ai répondu ci-dessous.
2nd: Dans ce cas, l’object proxy créera pour UserDetails ou pour la collecte (il rest une réponse).
Merci
1. Stratégies de récupération: Les stratégies de récupération n’affectent pas le fonctionnement de session.get ou de session.load ( https://docs.jboss.org/hibernate/orm/4.2/manual/en-US/html/ch20. html # performance-fetching-lazy ).
2. Session.get: il ne retourne jamais de proxy , comme indiqué dans la documentation d’hibernate: ( https://docs.jboss.org/hibernate/orm/3.5/javadocs/org/hibernate/Session.html#get(java.lang. Classe , java.io.Serializable))
Renvoie l’instance persistante de la classe d’entité donnée avec l’identificateur donné ou null si aucune instance persistante de ce type n’existe. (Si l’instance est déjà associée à la session, retournez cette instance. Cette méthode ne renvoie jamais d’instance non initialisée.)
Cela signifie get
méthode get
vérifie d’abord le cache si l’ fully initialize object
est présent. Si c’est le cas, cet fully initialize object
est retourné, sinon hits the database to get the object
et renvoyée de la même manière après l’avoir sauvegardé dans l’espace du cache.
3. Session.load: Selon les documents Hibernate :
Renvoie l’instance persistante de la classe d’entité donnée avec l’identificateur donné, en supposant que l’instance existe. Cette méthode peut renvoyer une instance mandatée initialisée à la demande lorsqu’un access à une méthode autre que l’identificateur est effectué.
La méthode load
signifie tout d’abord vérifier le cache si l’ fully initialize object
est présent et si yes renvoie cet object sinon il renvoie le proxy (Un proxy est une classe qui délègue à un autre object. Initialement, quand il n’est pas initialisé, il ne contient que le primaire Lorsque vous appelez une méthode, comme le dit Javadoc, elle s’initialise en chargeant l’entité réelle à partir de la firebase database et les delegates de cette entité chargée) de cet object en «supposant que cette instance existe».
Remarque: Il est important de noter que la méthode de load
never throw an exception
ObjectNotFoundException
never throw an exception
Vous obtiendrez ObjectNotFoundException
au cas où vous ObjectNotFoundException
de récupérer une autre propriété au lieu de la clé primaire de l’object proxy. En outre, la firebase database ObjectNotFoundException
à charger l’object à partir de celui-ci. n’est pas existe.
Ici, UserDetails
est le parent et Address
est l’enfant. Hibernate charge en fait l’ Address
enfant. Tous les éléments enfants ( Address
dans ce cas) ne sont donc pas préchargés lorsque vous chargez le parent ( UserDetails
dans ce cas).
Alors, quand tu fais ça:
user = (UserDetails) session.get(UserDetails.class, 1);
Hibernate ne charge pas réellement tous les enfants ( Collection
). Au lieu de cela, Hibernate charge uniquement l’ Address
lorsque vous y accédez explicitement. Donc, hibernate ne touchera pas la firebase database DB pour la table d’ Address
, sauf si vous en avez vraiment besoin et c’est l’objective du chargement paresseux .
Par chargement Lazy, cela signifie que même si vous obtenez un object proxy UserDetails
, il ne touche pas vraiment la table Address
moins que vous ne UserDetails
d’accéder explicitement aux éléments Collection. En d’autres termes, vous devez parcourir la collection pour que hibernate récupère la table Address
.
Vous pourriez vous retrouver dans une situation où vous frappez la firebase database à chaque fois pour chaque enfant ( Address
). Faites donc un appel explicite listOfAddresses.size()
afin de charger tous les enfants à la fois.
Notez également que le chargement différé se produira par défaut pour les cas un à plusieurs et plusieurs à plusieurs .
2 Ques Ans: Le proxy sera d’adresse pour le contexte de votre question, vous pouvez le dire. En profondeur ou en détail, hibernate créera d’abord un proxy pour userdetail, mais dès que la requête sera donnée, ce proxy aura des données. Mais comme hibernate est par défaut un chargement lazy et que Address est un enfant de UserDetail, il ne sera renvoyé que par proxy et vous obtiendrez uniquement la valeur id de Address (valeur de la clé primaire). Ne vous trompez pas à propos de proxy. Le proxy sera créé pour toutes les classes, soit la classe parent (UserDetail), soit la classe enfant (Address), mais pour la classe enfant, elle ne contiendra que des données id.