La recherche principale de cet article est
Le concept de paresseux : ne chargez un objet que lorsqu'il est réellement utilisé.
La stratégie paresseuse d'Hibernate peut être utilisée dans:
1. Sur la balise <cassad>, la valeur peut être prise: true / false.
2. Sur la balise <propriété>, la valeur peut être prise: vrai / false, et l'outil d'amélioration de la classe est nécessaire pour modifier le bytecode (cela n'a pas beaucoup de sens).
3. Sur les balises <set> et <s list>, les valeurs peuvent être prises: vrai / false / extra.
4. Sur les balises d'association à une seule endormie de <plusieurs à un> et <o-à-on>, vous pouvez obtenir la valeur: False / Proxy / Nophy
Jetons un coup d'œil aux paresseux sur l'étiquette de classe:
User.java:
classe publique User {/ * id * / private int id; / * Nom d'utilisateur * / nom de chaîne privée; / * mot de passe utilisateur * / mot de passe de chaîne privéUser.hbm.xml:
<? xml version = "1.0"?> <! doctype hibernate mapping public "- // Hibernate / Hibernate mapping dtd 3.0 // en" "http://hibernate.sourcefor.net/hibernate-mapping-3.0.dtd"> <! package = "com.lixue.bean"> <! - Le nom du nœud de classe représente le nom de classe de l'entité, et le tableau représente le nom de l'entité mappé à la table dans la base de données -> <class name = "user" table = "t_user" lazy = "true"> <id name = "id"> <générateur /> </ id> <! name = "mot de passe" /> <propriété name = "CreateTime" /> </ class> </ hibernate-mapping>
Méthode de test:
public void testLoad1 () {/ * Get User, Load lui-même prend en charge le chargement paresseux (la balise de classe Lazy est valide pour les propriétés ordinaires) * / utilisateur utilisateur = (utilisateur) HiberNateUtils.getSession (). Load (user.class, 1); / * ne publiera pas SQL (car l'ID est spécifié lorsque vous interrogez, il n'y a pas besoin de vérifier) * / System.out.print. user.getId ()); / * émettra SQL, car les attributs sont vraiment nécessaires pour le moment, l'instruction SQL sera publiée, et l'instruction publiée trouvera tous name) * / System.out.println ("user.password =" + user.getPassword ()); / * ne sera pas émis SQL (il a été découvert lors de la vérification du nom) * / System.out.println ("user.createtime =" + user.getcreatetime ());}; Essayez un point d'arrêt à User user = (User) HibernateUtils.getSession().load(User.class, 1); pour les tests!
L'objet apparaîtra dans l'utilisateur de l'objet -> Handler ---> Node cible, comme indiqué sur la figure:
1. Au début, la cible est nul. Lorsque user.getId() est exécuté, il est toujours nul, car l'ID est déjà spécifié lorsque nous interrogeons, il n'a donc pas de sens à interroger pour le moment.
2. Lors de l'exécution user.getName() , une instruction est publiée, comme indiqué sur la figure:
D'après le chiffre, nous pouvons voir que lors de l'interrogation de l'ID, aucune déclaration n'a été publiée. Comme nous venons de le mentionner, lorsque nous interrogeons l'attribut de nom, nous publions une instruction et la fonction de cette instruction est d'interroger tous les attributs.
3. Lorsque user.getPassword() et user.getCreateTime() sont exécutés, l'instruction ne sera plus émise car la valeur d'attribut a été interrogé auparavant.
Remarque: Lazy sur la balise <Class> prend en charge uniquement les attributs normaux et n'affectera pas le chargement des collections dans la classe.
Ce qui précède est tout au sujet de paresseux sur la balise <casse> du chargement paresseux hibernate, j'espère que ce sera utile à tout le monde. Les amis intéressés peuvent continuer à se référer à d'autres sujets connexes sur ce site. S'il y a des lacunes, veuillez laisser un message pour le signaler. Merci vos amis pour votre soutien pour ce site!