Cet article résume quatre façons de résoudre le problème du chargement paresseux de l'hibernate dans le processus d'apprentissage de l'hibernate.
Le soi-disant chargement paresseux est un chargement retardé, un chargement retardé.
Quand utiliser le chargement paresseux? Je ne peux répondre que lorsque vous souhaitez utiliser le chargement paresseux, utilisez un chargement paresseux.
Quant à savoir pourquoi nous devons utiliser le chargement paresseux, il est évident que lorsque la quantité de données auxquelles nous voulons accéder est trop grande, il ne convient évidemment pas d'utiliser le cache, car la capacité de mémoire est limitée. Afin de réduire la quantité de concurrence et de réduire la consommation de ressources système, nous laissons les données être chargées en cas de besoin, puis nous utilisons un chargement paresseux.
Par exemple, il existe un objet qui est un employé et un autre objet qui est le département. De toute évidence, pour les employés, c'est une relation plusieurs à un par rapport au département, et pour le département, c'est une relation un-à-plusieurs par rapport à l'employé. Lorsque nous interrogeons l'objet de l'employé, si nous voulons interroger le département correspondant par le biais du département de propriété de l'objet employé, une exception sera lancée. Cela est dû à l'existence d'un chargement paresseux. Une fois la session close, Hibernate publie une autre demande à la base de données et une exception est lancée.
Voici quatre façons de résoudre ce problème:
1. Initialisation explicite (à l'intérieur de la méthode de requête)
Lorsque vous demandez à quel département un employé appartient, vous devez pré-remettre le département
Utiliser la déclaration
Hibernate.Initialize (Department.Class);
2. Modifiez le fichier de relation objet et réécrivez-vous paresseux Lazy = false, c'est-à-dire un chargement paresseux
Les deux méthodes ci-dessus peuvent en effet résoudre le problème, mais l'inconvénient est que peu importe que l'objet soit utilisé plus tard, Hibernate émettra des instructions SQL à la base de données pour demander des données, provoquant un déchet de performance inutile.
3. Utilisez des filtres (projet Web)
① La façon d'obtenir la session doit utiliser GetCurrentession
② Méthode de la session de clôture spéciale
public void dofilter (ServLetRequest Request, ServletResponse Response, FilterChain Arg2) lève IOException, ServletException {// TODO Méthode générée automatiquement Stub Session Session = NULL; Transaction tx = null; essayez {session = hibernateUtil.getCurrentession (); tx = session.begintransaction (); arg2.dofilter (demande, réponse); // les demandes vont constamment tx.Commit (); } catch (exception e) {// todo: gère l'exception if (tx! = null) {tx.rollback (); }} Enfin {// Méthode de clôture spéciale hibernateUtil.closeCurrentession (); }}4. Dans le cadre SSH, utilisez l'OpenSessionView fourni par le printemps
Le principe est similaire à l'utilisation du filtre dans la troisième méthode, sauf que ce filtre est fourni par Spring. Lorsque vous l'utilisez, il vous suffit de le configurer dans le fichier web.xml comme suit:
<! - Utilisez Spring pour résoudre des problèmes de chargement paresseux -> <filter> <Filter-Name> OpenSessionInViewFilter </ Filter-Name> <Filter-Class> org.SpringFramework.OrM.HiberNate3.Support.OpensessionInViewFilter </ Filter-Class> </filter> <filter-mapping> <filter-name> OPENSSESSEVISEVERFORD </filter-nemed> <url-sattern> / * </ url-stern> </ filter-mapping>
Les méthodes en 3 et 4 peuvent également résoudre le problème du chargement paresseux, et la quatrième méthode est également utilisée plus fréquemment à l'heure actuelle. Cependant, ces deux méthodes ont également des inconvénients. L'inconvénient est qu'ils prolongent le moment où la session est fermée et le cycle de vie de la session devient plus long. Avant d'utiliser cette méthode, la session a été fermée après interroger les données; Maintenant, la session est close à la fin d'une demande Web.
Résumer
Ce qui précède concerne les quatre façons de résoudre le problème du chargement paresseux de l'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!