Le fichier de base de données initial requis dans cet article, un exemple de code complet pour les opérations d'hibernate communs (y compris tous les fichiers JAR requis pour les opérations Hibernate) est fourni pour le téléchargement et l'apprentissage: http://download.csdn.net/detail/daijin888888/9551724
1. Cartographie de l'association d'hibernate
1) Qu'est-ce que la cartographie de l'association?
S'il existe une association entre les tables, Hibernate nous permet de décrire leur association dans HBM.XML, puis d'opérer automatiquement sur une autre table de relations selon cette relation lorsque nous opérons l'une des tables. Ensuite, les paramètres de cette relation d'association sont appelés cartographie d'association.
2) Quels sont les avantages de la cartographie d'association?
Plusieurs tables peuvent être associées à une visite
- Supprimer les données du tableau relationnel associatif
- Associer les données nouvelles et modifiées des tables de relation
- Supprimer les données de la relation entre les relations
3) étapes de mise en œuvre de la cartographie de l'association
- Comprendre la relation entre les tables et clarifier les domaines relationnels
- Apendre l'attribut d'association dans la classe d'entité pour encapsuler les données associées
- Vous devez configurer le fichier HBM.XML et définir la relation d'association
* 2. Association un-à-plusieurs
Exemple: Si un compte a plusieurs enregistrements de service, on espère que lors de l'interrogation des données du compte, elle interroge automatiquement ses données de service correspondantes.
1) Relation de la table
Une relation un-à-plusieurs, le domaine de la relation est Service.Account_id. (C'est-à-dire qu'il doit y avoir un compte de champ associé à la table de compte dans la table de service, et ce champ correspond à l'ID dans le tableau du compte)
2) Ajouter les attributs de la relation
Dans la classe de compte, ajoutez les services d'attribut associés, qui est le type de type <ferger>.
set privé <Serfe> Services = new HashSet <fermed> ();
3) Mettre en place des relations
--grammaire
Définissez une relation un-à-plusieurs en compte.hbm.xml
<set name = "Association Attribute Name"> <key chronny = "Association Field Name" /> <One-to-Many /> </ set> --Implement <set name = "Services"> <key column = "account_id" /> <one-to-many /> </ set>
4) Exemple de code
Connu:
- Services d'attribut associés
- Associé sur le terrain Account_id
- Service d'objet Association -> Service de nom de table
<span style = "font-size: 14px;"> public void testFind () {session session = hibernateUtil.getSession (); Compte a = (compte) session.load (compte.class, 1010); System.out.println ("--- Afficher les informations du compte du compte ----"); System.out.println (a.getId () + "" + a.getRealName () + "" + a.getIdCardno ()); System.out.println ("- Afficher le compte commercial sous le compte courant ----"); Set <fersion> Services = A.getServices (); pour (Service S: Services) {System.out.println (s.getID () + "" + s.getOsUsername () + "" + s.getUnixHost ()); } System.out.println (a.toString ()); } </span>* 3. Association de plusieurs à un
Exemple: J'espère qu'après interroger les données de service, je peux automatiquement interroger ses données de compte correspondantes.
1) Relation
Le service et le compte ont une relation plusieurs à un, et le domaine de la relation est Service.Account_id
2) Ajouter les attributs associés
- APPED le compte de propriété associé dans la classe d'entité de service, son type est le compte.
compte de compte privé;
Après cela, l'attribut accoudID peut être supprimé et la valeur de Account_id peut être obtenue via la méthode getAccount (). GetID ()
3) Mettre en place des relations
un. Syntaxe:
--in Service.hbm.xml, ajoutez la configuration de la relation d'association
- <plusieurs à un nom = "Nom d'attribut d'association"
colonne = "nom de champ relationnel"
/>
né Mise en œuvre:
<plusieurs à un nom = "compte"
colonnes = "account_id"
/>
4) Exemple de code
Connu:
- Compte de propriétés d'association
- Associé sur le terrain Account_id
--Account -> Compte de nom de table, ID de clé primaire
<span style = "font-size: 14px;"> public void testFind () {session session = hibernateUtil.getSession (); Service S = (Service) Session.get (Service.Class, 2002); System.out.println ("---- Afficher les informations du compte commercial ----"); System.out.println (s.getID () + "" + s.getOsUsername () + "" + s.getUnixHost ()); System.out.println ("--- Afficher les informations de compte connexes ---"); System.out.println (s.getAccount (). GetID () + "" + s.getAccount (). GetRealName ()); } </span>* 4. Opérations connexes
1) Requête connexe
Si vous devez utiliser une instruction SQL pour instancier l'objet actuel et l'attribut associé, vous pouvez utiliser la méthode suivante:
un. (Non recommandé) Modifiez le mappage d'attribut associé dans HBM.XML
Attribut paresseux:
Le vrai signifie que le chargement paresseux est activé;
faux signifie clôturer le chargement paresseux
Attribut de récupération:
Join signifie que la méthode de connexion est utilisée pour interroger avec l'objet principal. À l'heure actuelle, Lazy = "false" n'est pas valide;
Sélectionner (par défaut) signifie envoyer une requête SQL aux données associées séparément
né (Recommandé) passer HQL et joindre la syntaxe de récupération
- du compte de jointure de jointure a.services où a.id =?
Signification: Lors de l'interrogation de l'objet du compte, les données d'attribut associées des services se trouvent ensemble à l'aide de la connexion de la table.
- du service s jointer fetch s.account où s.id =?
Signification: Lors de l'interrogation des objets de service, les données d'attribut associées du compte se trouvent ensemble à l'aide de la connexion de la table.
- du service s jointer fetch s.account où s.account.id =?
Avis:
- Les objets et les propriétés sont écrits en HQL
- JOINE Fetch n'a pas de clause sur la clause, et Fetch est un attribut associé
--Query.setInteger pour définir la valeur du paramètre entier, et l'indice commence à partir de 0.
- Si il est clair que le HQL ne renverra qu'un seul enregistrement, vous pouvez utiliser la méthode Query.UniqueResult () pour retourner un enregistrement unique
c. Exemple de code (réécrire le code de requête d'association un-à-plusieurs ci-dessus)
<span style = "font-size: 14px;"> public void testFind () {session session = hibernateUtil.getSession (); // compte a = (compte) session.load (compte.class, 1010); String hql = "From Compte a join fetch a.services où a.id =?"; Query Query = Session.CreateeQuery (HQL); query.setInteger (0, 1010); //? Démarrer à partir de 0 compte A = (compte) Query.UniqueResult (); // une question unique peut utiliser System.out.println ("--- Afficher les informations du compte ----"); System.out.println (a.getId () + "" + a.getRealName () + "" + a.getIdCardno ()); System.out.println ("--- Affichez le compte commercial sous le compte courant ----"); Set <fersion> Services = A.getServices (); pour (Service S: Services) {System.out.println (s.getID () + "" + s.getOsUsername () + "" + s.getUnixHost ()); } System.out.println (a.toString ()); } </span> 2) Addition en cascade et modification en cascade
un. Lorsqu'un tableau a une relation d'association, Hibernate fournit non seulement la fonction de la requête d'association, mais a également la capacité d'ajouter, de modifier et de supprimer les données dans le tableau d'association. Cette capacité est appelée opération en cascade.
né Comment implémenter les opérations en cascade
Vous devez ajouter la cascade d'attribut à l'emplacement où l'attribut associé est défini.
- non: la cascade n'est pas prise en charge par défaut
- Save-Update: prend en charge l'ajout en cascade et la mise à jour
- Delete: prend en charge la suppression en cascade
- All: prend en charge l'addition en cascade, la mise à jour et la suppression
c. Description
Habituellement, il existe une relation de table de 1 à plusieurs. Un côté de 1 est la table principale et l'autre côté de 1 est la table des esclaves. Il est souvent nécessaire d'ajouter, de mettre à jour et de supprimer les données de la table des esclaves lors de l'ajout, de la mise à jour et de la suppression du tableau principal. Par exemple: lors de la suppression d'un compte, vous devez supprimer ensemble les données du compte commercial.
3) Suppression en cascade
un. Définissez Cascade = "Delete" ou Cascade = "All" pour prendre en charge la suppression de Cascade
né Généralement, il est nécessaire d'ajouter l'attribut inverse = "true" à la balise de set de 1.
c. Session.delete (OBJ); OBJ doit être un objet persistant, ne peut pas être nouveau et doit être chargé / être récupéré.
d. Méthodes de suppression par lots:
Cascading Delete utilise N + 1 Supprimer des instructions pour effacer les données associées de la table principale et du tableau des clés étrangères.
S'il s'agit de suppression par lots , la suppression en cascade n'est pas recommandée. Il est recommandé d'utiliser HQL pour rédiger des instructions de suppression de suppression .
Supprimer du service où compte.id =? // Supprimer toutes les données de compte.id =? Dans la table de service, (cette phrase remplace n supprimer les instructions dans l'opération en cascade)
Supprimer du compte où id =?
4) Détails d'attribut inverse (compréhension) ici
S'il faut donner le contrôle de la maintenance des relations. Autrement dit, par défaut, la relation entre le compte et les objets de service est maintenue par les deux parties. Cela signifie que lorsque vous effectuez des opérations en cascade sur des objets de compte ou de service, vous devez exécuter une instruction de mise à jour pour définir le champ associé sur le même ID. Si vous devez annuler les travaux de maintenance de la relation d'une certaine partie, vous pouvez ajouter un paramètre inverse = "true" à la section Attributs associés, ce qui peut éviter l'exécution de l'instruction de mise à jour.
Vrai: remettre le contrôle, l'objet actuel n'est pas responsable du maintien de la relation entre les deux tables
Faux: le contrôle n'est pas remis, l'objet actuel doit être responsable du maintien de la relation entre les deux tables
Astuce: il est souvent défini sur inverse = "true" pour une partie (c'est-à-dire la pièce de mappage <o-à-à-pour-plusieurs) à inverse = "true", de sorte qu'un grand nombre d'instructions de mise à jour de mise à jour peuvent être évitées lors de l'opération en cascade sur une seule partie.
* 5. Association de plusieurs à plusieurs
Exemple: admin admin_info et rôle role_info ont une relation plusieurs à plusieurs. J'espère que lors de l'interrogation de l'administrateur, il peut interroger son rôle correspondant. Lors de la conception d'une base de données, il est nécessaire d'utiliser 3 tables pour la représenter.
Admin_info (admin)
Admin_role (relation administrateur et rôle)
Rôle (rôle)
1) champs de relations
Les champs de relation sont situés dans leur table intermédiaire admin_role,
admin_id = admin_info.id
role_id = role_info.id
2) Ajouter les attributs associés, ajoutez les attributs liés au rôle à la classe d'entité de l'administrateur
Définir les rôles <role>
3) Ajouter la configuration de cartographie de l'association dans admin.hbm.xml
--syntax <set name = "Association Attribute Name" Table = "Nom de la table médiane"> <key chronny = "Admin's Associated Field Name" /> <plusieurs-à-à-chronique = "Nom de champ associé de l'administrateur" /> </ set> - Code <set name = "rôles" Table = "Admin_Role"> <Key Column = "Admin_id" /> <plusieurs-à-many colonne
4) Fonctionnement en cascade
Cascade signifie que les opérations en cascade sont prises en charge et que le tableau fonctionne de l'autre côté, plutôt que de représenter le tableau intermédiaire des opérations en cascade. Pour la maintenance des tables intermédiaires, il n'est pas nécessaire d'écrire l'attribut Cascade.
5) inverse
D'une manière générale, les relations multiples-à-plusieurs n'ont pas besoin d'écrire inverse = "true". La raison en est que lorsque l'autre partie insère des données, elle peut ne pas avoir les données dans la table intermédiaire et la partie actuelle doit la maintenir. Par conséquent, inverse = "true" ne peut pas être écrit. Sinon, aucune des parties ne maintient cette relation et il y a des problèmes avec les données.
6) Exemple de code Java
<span style = "font-size: 14px;"> // supprimer le rôle @Test public void testdeleterole () {session session = hibernateUtil.getSession (); Transaction tx = session.begintransaction (); essayez {admin a = (admin) session.load (admin.class, 1); Rôle r1 = (rôle) session.load (role.class, 1); a.getroles (). retirer (r1); session.update (a); tx.Commit (); } catch (hibernateException e) {e.printStackTrace (); tx.rollback (); } enfin {session.close (); }} // Ajouter un rôle @Test public void testAdDrole () {session session = hibernateUtil.getSession (); Transaction tx = session.begintransaction (); essayez {admin a = (admin) session.load (admin.class, 1); Rôle r1 = (rôle) session.load (role.class, 1); Rôle r2 = (rôle) session.load (role.class, 43); Rôle r3 = (rôle) session.load (role.class, 44); a.getRoles (). add (r1); a.getRoles (). add (r2); a.getRoles (). Add (R3); session.update (a); tx.Commit (); } catch (hibernateException e) {e.printStackTrace (); tx.rollback (); } enfin {session.close (); }} @Test public void testFind () {session session = hibernateUtil.getSession (); Transaction tx = session.begintransaction (); essayez {admin a = (admin) session.load (admin.class, 1); System.out.println ("----- Afficher les informations de l'administrateur ----"); System.out.println (a.getId () + "" + a.getName () + "" + a.getTtelephone ()); System.out.println ("---- Afficher les informations sur le rôle de l'administrateur ---"); pour (rôle de rôle: a.getRoles ()) {System.out.println (Role.GetName () + ""); } tx.Commit (); } catch (hibernateException e) {e.printStackTrace (); tx.rollback (); } enfin {session.close (); }} </span>6. Association d'héritage
Exemple: Recherchez des produits sur des sites Web de commerce électronique, tels que l'entrée en iPhone pour rechercher. Les résultats de la recherche peuvent inclure des informations sur les produits liées aux téléphones mobiles, aux films de téléphonie mobile, aux étuis de téléphonie mobile, aux chargeurs, aux écouteurs, etc. Cette fonction peut être exprimée par une relation individuelle spéciale lors de la conception de tables. C'est-à-dire que les attributs communs de tous les produits sont extraits dans un produit de table commun. Seul le tableau de produit spécifique est stocké dans la table de produits spécifique, de sorte que la table de produit spécifique et la table de produit ont une relation un à un. Lors de la recherche, vous ne pouvez rechercher que le tableau des produits et vous pouvez rechercher flou des informations pertinentes.
- Produit de table d'informations générales (ID, nom, prix, desc)
- Book de la liste de produits (ID, Authod, Publishing, Words)
- J'espère que lors de l'exploitation de la table du livre, je peux automatiquement maintenir les champs communs dans le tableau des produits.
1) une relation claire
Les livres et les produits ont une relation individuelle. Le but de cette relation est de réutiliser les champs du tableau des produits, comme une relation de succession.
2) Classe d'entité
Le livre étend le produit
3) Les relations connexes se reflètent dans les fichiers de configuration
- Le type de parent est cohérent avec la méthode d'écriture de fichiers de configuration d'origine
- Les sous-types ont des caractéristiques spéciales
<join-subclass name = "type name" table = "Nom de la table" étend = "Nom de la classe parent"> <key column = "Association Field Name" /> <propriété name = "" type = "" Column = "" /> ... </ join-subclass>
4) Dans la relation d'héritage, puisque les deux tableaux ont une relation similaire à celle d'un parent et d'un enfant, les données du tableau parent doivent être référencées dans le tableau des enfants. Il n'y a pas de cas de non-référence, c'est-à-dire que le tableau parent doit être maintenu lors du maintien de la table des enfants. C'est donc une situation fixe, vous n'avez donc pas besoin d'écrire de la cascade ou de l'inverse.
5) Catégorie de description (comprendre)
<joint-subclass> La base de données a une table de classe parent et une table de classe enfant
<Union-Subclass> La base de données a une table de sous-classe et pas de table de classe parent (la table de sous-classe contient déjà le champ de table de classe parent, pas de table de classe parent, mais a un objet d'entité de classe parent)
<Sblass> La base de données a la classe des parents et la classe infantile et utilise une table (la conception est désordonnée, c'est-à-dire qu'il n'y a pas de division de table, et il est rarement utilisé)
* 7. Query Hibernate
1) * Query HQL (langue de requête Hibernate)
Il appartient à une instruction de requête orientée objet, interrogeant le POJO mappé par Hibernate, réalisant ainsi en interrogeant la base de données.
un. Utilisez une clé non primaire pour faire des requêtes conditionnelles
- Paramètres conditionnels à? Indique que Query.SetString (0, "");
- Les paramètres conditionnels sont représentés par: x, query.setstring ("x", "");
Exemple de code:
<span style = "font-size: 14px;"> // Testez pour interroger conditionnellement par clé non primaire @Test public void testFind1 () {String hql = "from Service Where Account.id =? et UnixHost =?"; Session Session = HiberNateUtil.getSession (); Query Query = Session.CreateeQuery (HQL); query.setInteger (0, 1011); Query.SetString (1, "192.168.0.23"); List <fermed> list = query.list (); pour (service s: list) {System.out.println (s.getId () + "" + s.getOsUsername () + "" + s.getUnixHost ()); } session.close (); } // est équivalent à TestFind1, en utilisant ": Identifier" au lieu de @Test public void testFind2 () {String hql = "From Service Where Account.id =: Aid et UnixHost =: host"; Session Session = HiberNateUtil.getSession (); Query Query = Session.CreateeQuery (HQL); query.setInteger ("Aid", 1011); Query.SetString ("Host", "192.168.0.23"); List <fermed> list = query.list (); pour (service s: list) {System.out.println (s.getId () + "" + s.getOsUsername () + "" + s.getUnixHost ()); } session.close (); } </span> né Interroger uniquement certains attributs
- La collection retournée par défaut encapsulée est objet []
- Le service (ID, UnixHost, OSUsername) résume l'objet de service dans la combinaison retournée.
Avis:
Un constructeur qui doit ajouter une réponse dans le service;
Ne jetez pas le constructeur sans paramètre;
Exemple de code:
<span style = "font-size: 14px;"> // Obtenez des résultats de champ et utilisez l'objet [] pour encapsuler les données par défaut @Test public void testFind3 () {String hql = "select s.id, s.unixhost, s.osuserName from Service s where s.account.id =?"; Session Session = HiberNateUtil.getSession (); Query Query = Session.CreateeQuery (HQL); query.setInteger (0, 1011); List <object []> list = query.list (); for (object [] objs: list) {System.out.println (objs [0] + "" + objs [1] + "" + objs [2] + ""); } session.close (); } // Équivalent à TestFind3, vous devez ajouter le constructeur correspondant @Test public void testFind4 () {String hql = "Select New Service (S.ID, S.Unixhost, S.OSUsername) From Service S Where S.Account.id =?"; Session Session = HiberNateUtil.getSession (); Query Query = Session.CreateeQuery (HQL); query.setInteger (0, 1011); List <fermed> list = query.list (); pour (service s: list) {System.out.println (s.getId () + "" + s.getOsUsername () + "" + s.getUnixHost ()); } session.close (); } </span> c. La définition de HQL est dans le fichier de configuration (comprenez)
- définir le HQL dans le fichier de configuration via l'élément de requête
- L'élément de requête est écrit derrière la classe
--Session.getNamedQuery (nom HQL);
Exemple de code: <query /> et <class /> sont placés dans hbm.xml au même niveau
<span style = "font-size: 14px;"> <queery name = "findall"> <! - Incluez des champs de texte brut en CDATA pour empêcher les caractères spéciaux -> <! [CDATA [From Service]]> </ Query> </span> <span style = "Font-Size: 14px;"> // Define HQL dans HBM.XML (unique testFind5 () {session session = hibernateUtil.getSession (); // Obtenez l'instruction HQL définie dans <query> dans HBM.XML Query Query = Session.GetNameDquery ("FindAll"); List <fermed> list = query.list (); pour (service s: list) {System.out.println (s.getId () + "" + s.getOsUsername () + "" + s.getUnixHost ()); } session.close (); } </span> d. Requête de pagination
- Records de requête
query.setFirStResult ((page-1) * pagesize);
query.setMaxResults (pagesize);
- REQUER LE Nombre total de pages
Sélectionnez Count (*) dans le service
Exemple de code:
<span style = "Font-Size: 14px;"> // Test Paging Query @Test public void testFind6 () {int page = 2; String hql = "From Service Order by Id"; Session Session = HiberNateUtil.getSession (); Query Query = Session.CreateeQuery (HQL); // Ajouter des paramètres de pagination pour définir query.setFirStResult ((page - 1) * 3); // définit le point de départ pour saisir les enregistrements, à partir de 0 query.setmaxResults (3); // définit le nombre maximum de crawls lish <fervice> list = query.list (); // exécuter la query, s'il n'y a pas de paramètre de pagination, de vérifier toutes System.out.println (s.getID () + "" + s.getOsUsername () + "" + s.getUnixHost ()); } session.close (); } // select count (*) from Service @Test public void testFind7 () {String hql = "select count (*) from Service"; Session Session = HiberNateUtil.getSession (); Query Query = Session.CreateeQuery (HQL); Taille longue = (long) query.UniqueResult (); System.out.println ("Nombre total d'enregistrements:" + taille); session.close (); } </span> e. Requête connexe (n'oubliez pas un)
- des services S, compte A
où s.account.id = a.id
- de service in intérieur join
--Sélect de S.Account.Realname du service S
Résumer:
Les similitudes entre HQL et SQL :
- Support Sélectionner, From, Where, Group, Order by Clause
- Support INNER JOIN, LA PLUS ET AUTRES CONNECTIONS
- Support>, <,> =, <=, dans, pas dans, entre, comme et d'autres conditions
- Support Grouping Statistics Fonctions Count, Sum, Max, Min, AVG
Les différences entre HQL et SQL :
- Les instructions-HQL sont sensibles à la casse, c'est-à-dire sensibles à la casse. Les mots clés sont indiscernables.
--hql écrit des noms d'objets et des noms d'attribut, pas des noms de table et des noms de champ
- La clause de jointure n'est pas prise en charge
- Select n'est pas pris en charge *
- Les fonctions du domaine ne sont pas prises en charge, telles que la fonction de date à_date (), la fonction de caractères vers_char (), etc.
2) Critères de la requête (pas assez intuitive, comprenez simplement)
Utilisez une API Hibernate pour épeler un HQL
Critères C = Session.CreateCriteria (service.class);
Exemple de code:
<span style = "font-size: 14px;"> // Utilisez l'API de HiberNate pour épeler un hql @Test public void testFind1 () {session session = hibernateutil.getSession (); Critères C = Session.CreateCriteria (service.class); C.Add (restrictions.and (restrictions.like ("ossername", "Huang%"), restrictions.eq ("Unixhost", "192.168.0.26"))); // CONDITIONS CONDITIONS LISTE <SERVICE> LIST = C.List (); // EXÉCUTER LA QUERY, IF n'y a pas de pagination, de vérifier toutes les valeurs C.AdDeder Ajouter le tri // C.SetFirStResult (Arg0); // Pagination // C.SetMaxResults (Arg0); pour (service s: list) {System.out.println (s.getId () + "" + s.getOsUsername () + "" + s.getUnixHost ()); } session.close (); } </span> 3) Requête SQL
Aidez-nous directement à appeler JDBC pour exécuter des requêtes SQL
SqlQuery sqlQuery = session.cretesqlQuery (SQL);
Exemple de code:
<span style = "font-size: 14px;"> @test public void testFind1 () {String sql = "select * from Service"; Session Session = HiberNateUtil.getSession (); SqlQuery sqlQuery = session.cretesqlQuery (SQL); SqlQuery.SetFirStResult (0); // Pagination SqlQuery.SetMaxResults (3); // Par défaut, un tableau est utilisé pour encapsuler une liste d'enregistrements <objet []> list = sqlQuery.list (); for (object [] objs: list) {System.out.println (objs [0] + "" + objs [2]); } session.close (); } // Identique à TestFind1 (), spécifiez l'entité qui résume l'enregistrement @Test public void testFind2 () {String sql = "select * from Service"; Session Session = HiberNateUtil.getSession (); SqlQuery sqlQuery = session.cretesqlQuery (SQL); SqlQuery.SetFirStResult (0); // Pagination SqlQuery.SetMaxResults (3); // Spécifiez la classe d'entité qui résume l'enregistrement sqlQuery.AdDentity (service.class); // encapsule un enregistrement avec le type de service spécifié Liste <fer Service> list = sqlQuery.list (); pour (service s: list) {System.out.println (s.getId () + "" + s.getOsUsername ()); } session.close (); } </span>8. Hibernate Advanced Fonctions (compréhension)
1) Cache de niveau 2
un. Cache de niveau 2 (par défaut)
- Le cache de deuxième niveau est un cache de niveau SessionFactory, qui est géré par le SessionFactory
- L'objet mis en cache est également un objet d'entité
- Les données couchées peuvent être partagées entre différentes sessions
- Environnement applicable: données d'objets fréquemment partagées; Petite fréquence de changement de données d'objet
né Étapes pour utiliser le cache de niveau 2
- package de cache-dérivé ehcache.jar
- Import Cache Configuration Fichier ehcache.xml
--in hibernate.cfg.xml, réglé pour activer le cache secondaire et définir la classe du pilote de cache
<span style = "font-size: 14px;"> <! - Utilisation du cache de niveau 2 -> <propriété name = "hibernate.cache.use_second_level_cache"> true </ propriété> <! - Spécifiez la classe du pilote ehcache.jar -> <propriété name = "hibernate.cache.provider_class"> org.hibernate.cache.ehcacheprovider </ propriété> </span>
--Tabillez l'élément dans le fichier de mappage relationnel hbm.xml du pojo à être mis en cache <cache usage = "readonly" />
Exemple de code:
<span style = "font-size: 14px;"> <span style = "font-size: 14px;"> @test public void testFind1 () {// Pour la première requête, utilisez session1 session session1 = hibernateUtil.getSession (); Service S1 = (Service) Session1.get (Service.Class, 2002); System.out.println (s1.getOsUsername () + "" + s1.getUnixHost ()); session1.close (); // La deuxième requête utilise Session2 (après avoir configuré le cache secondaire, les deux requêtes vont au cache secondaire pour récupérer les données) // hibernateutil.getSessionFactory (). Evict (Service.class); // Après la suppression, vous interrogez toujours deux fois. Session Session2 = HiberNateUtil.getSession (); Service S2 = (Service) Session2.get (Service.Class, 2002); System.out.println (S2.GetOsUsername () + "" + S2.GetUnixHost ()); } </span> </span> 2) Cache de requête
un. Cache de requête
Les caches de niveau 1 et 2 ne peuvent être cachés que des objets uniques. Si vous rencontrez un résultat de chaîne, un résultat de tableau ou une collection de liste, vous pouvez utiliser le stockage de cache de requête.
- Il peut être considéré comme un cache spécial de niveau 2
- L'espace de cache utilisé est le cache de deuxième niveau
- Le cache est le type de données autre que l'objet d'entité
- Rief sur le cache de niveau 2, il est désactivé par défaut et le cache de niveau 2 doit être activé avant de pouvoir être utilisé.
né Utiliser les étapes
- Cache de niveau 2 de l'Open
--Tet Cache de requête ouverte dans hibernate.cfg.xml
<span style = "font-size: 14px;"> <! - Allumez le cache de requête -> <propriété name = "hibernate.cache.use_query_cache"> true </ propriété> </span>
Avant que requête --Query.list (), query.setCacheable (true);
c. Environnement d'utilisation
- La même déclaration de requête qui doit être exécutée fréquemment
- Le jeu de résultats de la requête modifie la fréquence de la fréquence petite
- N'avez pas trop de données dans l'ensemble de résultats. Astuce: pour le même SQL, accédez à la base de données pour la première fois pour interroger et sortir du cache plusieurs fois à l'avenir. Parce que le contenu de l'ensemble de résultats SQL + est mis en cache
Exemple de code:
<span style = "font-size: 14px;"> <span style = "font-size: 14px;"> @test public void testFind () {find (); System.out.println ("-------"); trouver(); } private void find () {String hql = "from Service Where Account.id =?"; Session Session = HiberNateUtil.getSession (); Query Query = Session.CreateeQuery (HQL); query.setInteger (0, 1011); // Activer Query Cache Exécution Query.SetCachable (true); List <fermed> list = query.list (); pour (service s: list) {System.out.println (s.getId () + "" + s.getOsUsername ()); }} </span> </span>9. Hibernate Berrouillage de traitement simultané
Par exemple:
Simuler le mécanisme d'achat de billets 12306, en supposant qu'il y a actuellement un billet de billet (ID, ligne, montant, version) des billets de train et simulez le scénario où plusieurs personnes achètent des billets en même temps.
1) serrure pessimiste
- Le programme est pessimiste que chaque visiteur ait un problème de concurrence, donc chaque élément de données sera verrouillé. Ensuite, ce n'est que lorsque le visiteur actuel tenant le verrouillage libère le verrouillage que le visiteur suivant peut accéder aux données. Ce mécanisme est appelé verrouillage pessimiste.
- c'est-à-dire que vous devez verrouiller des données quoi qu'il arrive, que les données auront une concurrence.
--Caractéristiques
Faible efficacité et sécurité élevée
--accomplir:
get (classe, id, lockmode.upgrade)
Sélectionnez * dans EMP pour la mise à jour
Remarque: Ici, nous utilisons la clause FOR UPDATE qui est livrée avec la base de données pour le verrouillage, et non le mécanisme de verrouillage inventé par Hibernate lui-même.
2) verrouillage optimiste
- Le programme est optimiste que chaque visiteur n'aura pas de problèmes simultanés, donc il n'ajoute pas de verrous. Au lieu de cela, lorsque les données sont mises à jour, il est déterminé si la version des données a changé. Si cela change, cela signifie qu'il y a des événements simultanés au cours de cette période. Par conséquent, une erreur est signalée et la mise à jour a échoué.
- Avec l'aide du champ de version, lorsque le premier utilisateur met à jour et se soumet, Hibernate mettra à jour le champ par 1, de sorte que le champ de version d'objet soumis par l'utilisateur suivant est plus petit que celui de la base de données, c'est-à-dire que lorsque la version changera lors de la mise à jour, une exception sera lancée et que la mise à jour échouera.
- Un succès, d'autres échecs
--Caractéristiques
Haute efficacité et mauvaise expérience utilisateur
--accomplir
un. Vous devez ajouter le champ de version à la table pour enregistrer la version des données;
né Ajouter les attributs de version à la classe d'entité;
c. La configuration de la version supplémentaire dans HBM.XML <Version Name = "" Type = "" Column = "">
3) Comment choisir
- Si la concurrence est grande, le verrouillage de l'optimisme doit être sélectionné
- Si la concurrence est petite, vous devez choisir un verrou pessimiste
Ce qui précède est l'analyse complète des opérations liées à l'hibernate, des opérations de requête, des fonctionnalités avancées et du mécanisme de traitement de la concurrence qui vous est présenté par l'éditeur. J'espère que cela vous sera utile. Si vous avez des questions, veuillez me laisser un message et l'éditeur vous répondra à temps. Merci beaucoup pour votre soutien au site Web Wulin.com!