88 votes

Mise en veille prolongée : Différence entre session.get et session.load

De l’API, j’ai pu voir qu'il a quelque chose à voir avec le proxy. Mais je ne pouvait pas trouver beaucoup d’informations sur proxy et ne comprends pas la différence entre appeler et . Quelqu'un pourrait-il s’il vous plaît expliquer ou me diriger vers une page de référence ?

Merci !!

116voto

duffymo Points 188155

À partir de la veille prolongée forum:

Ce à partir du carnet de mise en veille prolongée dans l'Action. Bonne lecture de ce..


De la récupération d'objets par identifiant La suite Hibernate extrait de code récupère un objet Utilisateur à partir de la base de données:

User user = (User) session.get(User.class, userID);

La méthode get() est spéciale, car l'identificateur qui identifie de manière unique un unique instance d'une classe. Par conséquent, il est courant pour les applications à utiliser l'identificateur de pratique, la poignée à un objet persistant. La récupération par l'identificateur peut utiliser le cache lors de la récupération d'un objet, en évitant une base de données frappé si l'objet est déjà dans le cache. Hibernate fournit également une méthode load ():

User user = (User) session.load(User.class, userID);

La méthode load() est plus; get() a été ajouté à Hibernate de l'API en raison de l'utilisateur demande. La différence est trivial:

Si la méthode load() ne peut pas trouver l'objet dans le cache ou la base de données, une exception est jetés. La méthode load() ne retourne null. La méthode get() renvoie la valeur null si l'objet ne peut pas être trouvé.

La méthode load() peut retourner un proxy au lieu d'une véritable instance persistante. Un proxy est un espace réservé qui déclenche le chargement de l'objet réel quand il est consulté pour la première fois; Sur le d'autre part, get() renvoie jamais à un proxy. Le choix entre get() et load() est simple: Si vous êtes certain de la persistance de l' objet existe, et la non-existence, serait considéré comme exceptionnel, load() est une bonne option. Si vous n'êtes pas certain qu'il y est une instance persistante avec le identifiant, utilisez get() et de tester la valeur de retour pour voir si elle est null. À l'aide de la méthode load() a une autre implication: L'application peut récupérer une référence valide (un proxy) pour un instance persistante, sans frapper, la base de données pour récupérer la persistance de l'état. Donc load() peut ne pas jeter une exception lorsqu'il ne trouve pas l'objet persistant dans le cache ou la base de données, à l'exception sera levée plus tard, lorsque le proxy est accessible. Bien sûr, la récupération d'un objet par l'identificateur n'est pas aussi souple que l'utilisation arbitraire les requêtes.

15voto

Jorge Alves Points 977

Eh bien, dans nhibernate au moins, de la session.Get(id) va charger l'objet à partir de la base de données, tandis que la séance.Charge(id) seulement crée un objet proxy sans quitter votre serveur. Fonctionne comme tous les autres paresseux-chargé de propriété dans votre POCOs (ou Pojo :). Vous pouvez ensuite utiliser ce proxy comme une référence à l'objet lui-même de créer des relations, etc.

Pensez-y comme à un objet qui ne conserve que l'Id et qui va charger le reste si jamais vous en avez besoin. Si vous êtes juste de passage pour créer des relations (comme FKs), l'id est tout ce que vous aurez jamais besoin.

9voto

vishal sharma Points 820

session.load() retournera toujours un "proxy" (Hibernate terme) sans toucher à la base de données. En veille prolongée, le proxy est un objet avec la valeur de l'identifiant, ses propriétés ne sont pas initialisés encore, il suffit de regarder comme un temporaire de faux objet. Si aucune ligne trouvée , il jette un ObjectNotFoundException.

session.get() toujours frapper la base de données et de retour de l'objet réel, un objet qui représente la ligne de base de données, pas de proxy. Si aucune ligne trouvée , elle renvoie null.

Les performances de ces méthodes ont également fait diff . entre les deux...

3voto

madhureddy480 Points 39

Un point Extra ::

Téléchargez le mode de Session Hibernate classe retourne null si l’objet est introuvable dans le cache, ainsi que sur la base de données. alors que la méthode load() lève ObjectNotFoundException si l’objet n’est trouvé sur le cache ainsi que sur la base de données mais jamais retourner null.

2voto

SteveT Points 156

Une conséquence indirecte de l'utilisation de "charger" au lieu de "get", c'est que le verrouillage optimiste à l'aide d'un attribut de version peut ne pas fonctionner comme vous le souhaitez. Si une charge crée simplement un proxy et ne pas lire à partir de la base de données, la version de propriété n'est pas chargé. La version ne sera chargée quand/si plus tard vous référer à une propriété sur l'objet, le déclenchement d'un select. Dans l'intervalle, une autre session de mise à jour de l'objet, et votre session n'aura pas la version originale qu'il faut pour faire l'optimiste de verrouillage de l'enregistrement de sorte que votre session de mise à jour va écraser l'autre session de mise à jour sans avertissement.

Voici une tentative d'esquisser ce scénario avec deux séances de travail avec un objet avec le même identifiant. Version initiale de l'objet en DB est de 10.

Session 1                  Session 2
---------                  ---------
Load object
Wait a while..   
                           Load object
                           Modify object property
                           [triggers db 'select' -
                            version read as 10]
                           Commit
                           [triggers db update,
                            version modified to 11]
Modify object property
  [triggers db 'select' -
  version read as 11]
Commit
  [triggers db update,
  version modified to 12]

En fait, nous voulons session 1 commit à l'échec avec une vision optimiste de verrouillage exception, mais il va réussir ici.

À l'aide de "get" au lieu de "charger" contourne le problème, parce que obtenir immédiatement émettre un select, et les numéros de version sera chargé au bon moment pour les optimistes de verrouillage de la vérification.

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