Quelle est la différence entre get() et la méthode load() de la session hibernate à l'égard de l'extraction?
Quelle est la différence entre get () et la méthode load ()? à l'égard de la récupération de données approche
public static void main(String[] args) {
SessionFactory factory= new Configuration().configure().buildSessionFactory();
Session session = factory.openSession();
Transaction tx = null;
tx = session.beginTransaction();
System.out.println("1 st time calling load method");
Account acc =
(Account)session.load(Account.class, 180);
System.out.println("bal"+acc.getBalance());
System.out.println("2nd time calling load method");
Account acc1=(Account)session.load(Account.class, 180);
System.out.println("bal"+acc1.getBalance());
System.out.println("1 st time calling get method");
Account acc2= (Account) session.get(Account.class, accId);
System.out.println("bal"+acc2.getBalance());
System.out.println("2 st time calling get method");
Account acc2= (Account) session.get(Account.class, accId);
System.out.println("bal"+acc2.getBalance());
tx.commit();
session.close();
}
Je suis sortie suivante
1 st time calling load method
Hibernate:
/* load com.abcd.Account */ select
account0_.ACCOUNTID as ACCOUNTID1_0_,
account0_.ACCOUNTTYPE as ACCOUNTT2_1_0_,
account0_.CREATIONDATE as CREATION3_1_0_,
account0_.BALANCE as BALANCE1_0_
from
a.MYACCOUNT account0_
where
account0_.ACCOUNTID=?
bal3000.0
2nd time calling load method
bal3000.0
1 st time calling get method
bal3000.0
2 st time calling get method
bal3000.0
De sortie, il est clair que la méthode get n'a pas frappé de la base de données.Il se comporte comme méthode load (). Pouvait-on me dire est ce comportement correct.
- La base de données frappé arrive au point où vous appelez
acc.getBalance()
sur l'instance que vousload()
-ed. Après que les données sont mises en cache dans la session et suivantesget
appels sur la même session n'avez pas besoin de frapper la DB de nouveau.
Vous devez vous connecter pour publier un commentaire.
Que T Mishra états ici:
En fait, les deux fonctions sont à utiliser pour récupérer un objet avec un mécanisme différent,
session.load()
Il 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()
Il 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.
Lorsque vous appelez session.la méthode load (), il retournera toujours un “proxy” de l'objet, quel est le sens de l'objet proxy ?
Procuration, hibernate va préparer un faux objet avec identifiant donné de la valeur dans la mémoire, sans frapper, la base de données, par exemple si nous appelons session.load(Student.class,new Integer(107)); > hibernate va créer un faux Étudiant objet [ligne] dans la mémoire avec l'id 107, mais qui restent propriétés de l'Élève de la classe ne sera pas initialisé.
OBTENIR
Lorsque vous appelez session.méthode get (), il sera frappé de la base de données immédiatement et retourne l'objet d'origine.
Si la ligne n'est pas disponible dans la base de données, elle renvoie null.
hibernatesession.get() va chercher l'objet réel à partir de la base de données et hibernatesession.load() va retourner la procuration sans frapper, la base de données. Pour plus de détails, cliquez sur ici. Il explique d'obtenir et de la méthode de chargement et de leur différence avec les exemples de codes.
Charge d'utilisation:
Si vous êtes sûr à propos de l'objet de la disponibilité que vous récupérez
à partir de DB. Sinon, vous recevrez finit par attraper ObjectNotFoundException.
Lorsque vous avez un objet lourd à charger (Car il charge paresseusement à chaque fois que vous l'utilisez)
Utiliser get:
** Charge:** Chaque fois que l' load() méthode est appelée, hibernate crée un proxy objet d'une classe POJO, et il va définir l'id de l'objet proxy, puis il retourne l'objet proxy pour le programme. Basé sur les opérations effectuées sur l'objet proxy, hibernate va décider d'aller de cache de base de données ou pour charger les données. Ce processus est appelé le chargement paresseux.
** Obtenir:** Lorsque nous appelons la get() méthode, puis hibernate va tout d'abord au premier niveau de cache et que si l'objet n'existe pas dans le premier niveau de cache puis il va à la base de données et les charges de l'objet à partir de la base de données. Si l'Id n'existe pas dans la base de données, la méthode get() renvoie la valeur null. Lorsque la méthode get() est appelée aucun proxy objet est créé, il est donc appelé en charge précoce.
Ref : http://docs.jboss.org/hibernate/orm/4.3/javadocs/
Exemple complet vous pouvez trouver @ mon blog: http://www.onlinetutorialspoint.com/hibernate/hibernate-session-differences-between-load-and-get.html
Voici une explication simple de ce que vous avez besoin de:
http://www.mkyong.com/hibernate/different-between-session-get-and-session-load/
Ou en regardant l'API:
http://docs.jboss.org/hibernate/orm/4.3/javadocs/
avec
get
: Retour de la persistance de l'instance de l'entité nommée. La persistance de l'un, de sorte que celui stocké dans la base de données.avec
load
: Lire la persistance de l'état associé à l'identifiant donné dans le transitoires instance.Dans le premier lien que vous trouverez très utile exemples pour tester les différences..
De charge: lorsque nous appelons la session.la méthode load() il ne frappe pas directement de la base de données. Il crée et retour proxy de l'objet, si l'objet n'appartient pas, en db, il jette "ObjectNotFountException". Et prend en charge le chargement paresseux.
Obtenir: Il frappe directement l'objet en db et donne de la valeur d'origine si l'objet n'est pas trouvé, alors il retourne la valeur null. Et il prend en charge le chargement impatient.
À partir de l'exemple ci-dessus - à la fois les fonctions ne sont pas de travail même.
load() - hibernate ne charge que les proxy de l'objet avec l'ID spécifié. Toutes les propriétés ne seront pas fixés à l'avance. Une fois que vous appelez les méthodes de lecture sur l'objet, la requête sera questions de.
Alors, quand vous pouvez une getAccount méthode , sélectionnez la requête sera émis et l'objet de résultat sera enregistré dans le cache comme il est récupéré par ID. Donc, tous les appels suivants via obtenez pas le résultat d'une instruction select.
get() - récupère toujours l'objet de base de données avec des propriétés complètes peuplée. Pour les propriétés définies dans les collections, dépend de l'initialisation de la configuration.
Veuillez noter que les appels suivants sur la même session sera de retour l'objet à partir du cache, et donc aucune des requêtes sera retourné. C'est ce qui se passe avec l'appel à la méthode get dans la première fois et la deuxième fois que l'objet est prêt en cache par l'appel de l'acc.getBalance() sur l'objet récupéré par la charge.
N'oubliez pas de performances entre get et de la méthode de chargement
La méthode get() récupère des données dès que c'est exécutée alors que la méthode load() retourne un objet proxy et récupère uniquement les données lorsque les propriétés de l'objet est nécessaire.
De sorte que la méthode load() obtient de meilleures performances, car il en charge le chargement paresseux.
On doit utiliser la méthode load() uniquement quand nous savons qu'il existe des données, car il déclenche une exception lorsque les données n'est pas trouvé.
Vous pouvez voir l'exemple de démonstration de cette différence sur le tutoriel La différence entre obtenir et de la méthode de chargement en veille prolongée
Lorsque vous appelez
session.load()
méthode, il retournera toujours unproxy
objet, quel est le sens de l'objet proxy ?Proxy
moyens, hibernate va préparer un faux objet avec identifiant donné de la valeur dans la mémoire, sans frapper, la base de données, par exemple si nous appeler.Il sera frappé de la base de données que lorsque nous essayons de récupérer les autres propriétés de
Student
objet que je veux direstdName
,stdCountry
.Si nous appelons
s2.getStdName()
puis hibernate va frapper la base de données et de recherche de la ligne avec identification de l'élève 107 et récupérer les valeurs, siobject [row]
pas trouvé dans la base de données il jetteObjectNotFoundException
.Lorsque vous appelez
session.get()
méthode, il sera frappé de la base de données immédiatement et retourne l'objet d'origine.Si la ligne n'est pas disponible dans la base de données, il retourne
null
.Alors, quelle est la meilleure méthode à utiliser, hibernate
load()
ouget()
?C'est entièrement votre choix .