Comment Session.obtenez méthode fonctionne en mode veille prolongée
Je suis en train de comprendre que la façon dont l'initialisation de l'objet de travaux pour objet retourné par la Session de la méthode Get.Merci de valider ma compréhension. Lorsqu'il s'exécute, il vérifie objet avec identifiant donné dans le premier niveau de cache et ensuite le cache de Second niveau (S'il est configuré), Si pas trouvé, alors les feux de la requête select pour récupérer les données à partir de la base de données.
Ma question est, faut-il inclure les associations dans la requête select qui sont configurés pour le chargement paresseux ou la valeur null, la valeur est définie pour ces associations à objet retourné?
Si c'est le cas, alors la session.obtenez de ne pas faire de terminer l'initialisation de l'objet retourné, qui est contradictoire avec ce qui est écrit sur la plupart des hibernate tutoriels disponibles sur le web.
Vous devez vous connecter pour publier un commentaire.
Pour répondre à la question:
1) Le
session.get()
sera PAS initier paresseux choses. JAMAIS. En fait, c'est la centrale de la pensée de la conception. Autrement, nous serions en mesure de charger DB entière d'un seul COUP (en JAVA appel àsession.get()
)2) Et aussi, il y NE être null à la place. Chaque référence ou de la collection représentée par proxy. C'est de cette façon que nous pouvons éviter de charger compelte DB d'un seul coup (tous les trucs initialisé avec une méthode get). Parce que chaque proxy est en fait une promesse, une fois que nous allons toucher... il va charger les données réelles.
Et ainsi de suite. Donc obtenir est très sûr de la manière de recevoir comme peu de données comme il a été configuré....
Session Hibernate fournir différentes méthodes pour récupérer des données à partir de la base de données. Deux d'entre eux sont – get() et load().
get() retourne l'objet par l'extraction à partir de la base de données ou de mise en veille prolongée cache.
lorsque nous utilisons get() pour récupérer les données qui n'existe pas, elle renvoie null, parce qu'il essaie de charger les données dès qu'elle est appelée.
Par Exemple :
Dans une application Stock , Stock et StockTransactions devrait avoir un “un-à-plusieurs” de la relation, lorsque vous souhaitez enregistrer une transaction de stock, il est courant d'déclaré quelque chose comme ci-dessous.
De sortie :
Dans la session.get(), Hibernate va frapper la base de données pour récupérer l'objet de Stock et de le mettre comme une référence à StockTransaction.
Simplement
Quand
get()
méthode est appelée, elle va directement frapper la base de données, de récupérer le résultat et revenir. Si aucune correspondance n'champs sont trouvés, il sera heureux de retourner la valeur null.Selon les annotations sur les références, Paresseux ou Désireux, les données seront retournés. si
Lazy
, proxy sera retourné au lieu de null, siEager
, entièrement initialisé objet sera retourné.De mieux surveiller les requêtes à l'arrière-plan, pour une bonne compréhension.
1) Clientèle de classe d'entité que la carte de la T_CUSTOMER de la table DB:
2) l'Adresse de l'entité de la classe que la carte de la T_ADDRESS de la table DB:
Considérer cette table Clients :
Au-Dessus de la table clients est d'avoir un enregistrement avec cust_id 101.
Considèrent cette Table d'Adresses :
Maintenant, Quand vous invoquez :
Puis Hibernate lancer une Requête SQL quelque Chose comme :
1). En cas de DÉSIREUX de CHARGEMENT :
SELECT * FROM T_CUSTOMER cust JOIN T_ADDRESS add ON cust.cust_id=add.cid
je.e, Il va charger toutes les données relatives à la T_CUSTOMERS table et les tables associées, qui est T_ADDRESS table dans ce cas.
2). J'cas de CHARGEMENT différé :
Alors, il ne récupère les données correspondant à la T_CUSTOMER table et utilise un Proxy pour le T_ADDRESS table comme dit plus haut par @Radim Köhler. Il va extraire les données de la T_ADDRESS TABLE uniquement lorsque vous les appellerez :