Hibernate: session.load vs session.get

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

entrez la description de l'image ici

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.