Cartographie des cartes
Map Map est une collection Java qui stocke les éléments dans des paires de valeurs clés et ne permet pas d'éléments en double dans une liste. L'interface MAP offre trois vues de collecte, permettant au contenu de la carte d'être considéré comme un ensemble de collections de valeurs de clé ou de définir la relation de mappage de valeurs de clé.
La carte est mappée sur un élément <aponde> de la table de mappage et une carte non ordonnée peut être initialisée dans java.util.hashmap.
Définir le Tableau SGBDR:
Considérez une situation où nous avons besoin de dossiers des employés à stocker dans le tableau des employés, qui aura la structure suivante:
Créer un employé de table (id int not null auto_increment, first_name varchar (20) par défaut null, last_name varchar (20) par défaut null, salaire int null, clé primaire (id));
En outre, il est supposé que chaque employé peut avoir un ou plusieurs certificats liés à lui. Nous stockons les informations pertinentes du certificat dans un tableau séparé avec la structure suivante:
Créer un certificat de table (id int not null auto_increment, certificate_type varchar (40) par défaut null, certificate_name varchar (30) par défaut null, employee_id int défaut null, clé primaire (id));
Il existe une relation un-à-plusieurs entre l'employé et l'objet de certificat.
Définir la classe Pojo:
Implémentons un employé de la classe Pojo qui sera utilisé pour contenir une collection d'objets dans la table des employés et une variable de liste avec des certificats.
import Java.util. *; Employé de classe publique {private int id; String privé FirstName; String privé LastName; Salaire int privé; Certificats de carte privée; Employee public () {} Public Employee (String fname, String lname, int salaire) {this.firstName = fname; this.lastName = lname; this.salary = salaire; } public int getID () {return id; } public void setid (int id) {this.id = id; } public String getFirstName () {return firstName; } public void setFirstName (String first_name) {this.firstname = first_name; } public String getLastName () {return lastName; } public void setLastName (string last_name) {this.lastname = last_name; } public int getSalary () {return salaire; } public void setsalary (int salaire) {this.salary = salaire; } Map public getCertificates () {return Certificates; } public void setCertificates (Certificats de carte) {this.certificates = certificats; }}Nous avons besoin du tableau de certificat correspondant pour définir une autre classe POJO, un tel objet de certificat peut stocker et récupérer le tableau de certificat.
Certificat de classe publique {private int id; nom de chaîne privé; Certificat public () {} Certificat public (nom de chaîne) {this.name = name; } public int getID () {return id; } public void setid (int id) {this.id = id; } public String getName () {Nom de retour; } public void setName (string name) {this.name = name; }} Définissez le fichier de mappage Hibernate:
Développer un fichier de mappage qui instruit Hibernate comment définir une classe mappée dans une table de base de données. L'élément <map> sera utilisé pour définir les règles de la carte utilisée.
<? xml version = "1.0" Encoding = "UTF-8"?> <! Doctype Hibernate-Mapping Public "- // Hibernate / Hibernate Mapping Dtd // en" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping> table = "Employee"> <meta attribut = "class-description"> Cette classe contient le détail des employés. </ meta> <id name = "id" type = "int" chronn = "id"> <générateur /> </ id> <map name = "certificats" cascade = "all"> <key column = "employee_id" /> <index column = "Certificate_type" type = "string" /> <one-to-many /> </ map> <propriété nom = "firstname" collumn = "first_name" type = "string" /> <propriété name = "lastName" chronn = "last_name" type = "string" /> <propriété name = "salaire" colonnes = "salaire" type = "int" /> </ class> <class name = "certificate" table = "certificate"> <meta attribute = "class-decription"> Cette classe contient les enregistrements de certificat. </ meta> <id name = "id" type = "int" chronn = "id"> <générateur /> </ id> <propriété name = "name" colonnen = "certificate_name" type = "string" /> </ class> </ hibernate-mapping>
Le format <classname> .hbm.xml dans le fichier de mappage qui doit être enregistré. Nous enregistrons le fichier employee.hbm.xml dans le fichier de mappage. Déjà familier avec la plupart des détails de cartographie, mais examinons à nouveau tous les éléments du fichier de mappage:
Un document mappé est un document XML avec <Hibernate-Mapping> en tant qu'élément racine correspondant à chaque classe contenant 2 <classe>.
L'élément <scons> est utilisé pour définir un mappage spécifique de la table de base de données à partir d'une classe Java. Le nom de la classe Java spécifie l'attribut de nom de l'élément de classe et la base de données d'attribut de table Nom de la table Spécifie.
L'élément <Meta> est un élément facultatif qui peut être utilisé pour créer une description de la classe.
L'élément <id> mappe l'attribut ID unique dans la classe à la clé principale de la table de base de données. L'attribut de nom de l'élément ID fait référence à la classe de l'attribut et l'attribut de colonne fait référence aux colonnes de la table de base de données. L'attribut de type enregistre le type de mappage Hibernate, qui sera converti de Java en type de données SQL.
L'élément <générateur> dans l'élément ID est utilisé pour générer automatiquement la valeur de clé primaire. Définissez l'attribut de classe de l'élément généré pour être natif pour laisser Hibernate ramasser l'algorithme dans l'identité, la séquence ou Hilo pour créer des clés primaires en fonction des capacités de support de la base de données sous-jacente.
L'élément <propriété> est utilisé pour cartographier les propriétés d'une classe Java aux colonnes dans une table de base de données. L'attribut de nom d'un élément fait référence à la classe de l'attribut et l'attribut de colonne fait référence aux colonnes de la table de base de données. L'attribut de type enregistre le type de mappage Hibernate, qui sera converti de Java en type de données SQL.
L'élément <map> est utilisé pour définir la relation entre le certificat et la classe des employés. Nous utilisons l'élément <map> de l'attribut Cascade pour dire à Hibernate pour enregistrer l'objet de certificat, ainsi que dans l'objet employé. L'attribut de nom est défini pour définir le MapVariable dans la classe parent, dans notre cas le certificat.
L'élément <dex> est utilisé pour représenter des paires de clés / valeur de clés et de valeurs. Cette clé utilisera un type de chaîne stocké dans la colonne Certificate_Type.
L'élément <yey> est l'objet parent contenant une clé étrangère, c'est-à-dire la colonne de la table de certificat. Employé de table.
L'élément <o-à-plusieurs> indique qu'un objet employé implique de nombreux objets de certificat et, par conséquent, l'objet de certificat doit être lié à la classe parent de l'employé. Vous pouvez utiliser les éléments <One-to-one>, <plusieurs-à-un> ou <plusieurs-à-à-à-mères> selon les besoins.
Créer une classe d'application:
Enfin, créez la méthode Main () de la classe d'application pour exécuter l'application. Utilisez cette application pour enregistrer les enregistrements des employés ainsi que la liste de certificats, puis effectuer des enregistrements sur l'opération CUD sur l'application.
import java.util. *; import org.hibernate.hibernateException; import org.hibernate.Session; import org.hibernate.transaction; import org.hibernate.essionfactory; import org.hibernate.cfg.configuration; classe publique managemployee {private static sessionfactory factory; public static void main (String [] args) {try {factory = new Configuration (). configure (). buildSessionFactory (); } catch (Throwable ex) {System.err.println ("Échec de la création de l'objet SessionFactory." + Ex); Jetez une nouvelle exceptionIninializizerError (ex); } ManageMloyee me = new ManageMloyee (); / * Avons un ensemble de certificats pour le premier employé * / hashmap set = new HashMap (); set.put ("ordinateur", nouveau certificat ("MCA")); set.put ("BusinessManagement", nouveau certificat ("MBA")); set.put ("projectManagement", nouveau certificat ("PMP")); / * Ajouter des enregistrements des employés dans la base de données * / Integer Empid = me.addemployee ("manoj", "kumar", 4000, set); / * Énumérez tous les employés * / me.listEmployee (); / * Mettre à jour les dossiers salariaux de l'employé * / me.updateEmployee (Empid, 5000); / * Énumérez tous les employés * / me.ListEmployees (); }! Transaction tx = null; EmployeeId entier = null; try {tx = session.begintransaction (); Employé employé = nouvel employé (FNAME, LNAME, SALAIRE); Employee.SetCertificates (CERT); EmployeeId = (entier) Session.Save (employé); tx.Commit (); } catch (hibernateException e) {if (tx! = null) tx.rollback (); e.printStackTrace (); } enfin {session.close (); } return EmployeeId; }! Transaction tx = null; try {tx = session.begintransaction (); Lister les employés = session.CreateeQuey ("From Employee"). List (); pour (iterator iterator1 = employés.iterator (); iterator1.hasnext ();) {employee employé = (employé) iterator1.next (); System.out.print ("prénom:" + employee.getFirstName ()); System.out.print ("nom de famille:" + employee.getLastName ()); System.out.println ("Salaire:" + employee.getsalary ()); Map ec = employee.getCertificates (); System.out.println ("Certificat:" + (((Certificate) EC.get ("ComputerScience")). GetName ())); System.out.println ("Certificate:" + (((Certificate) eC.get ("BusinessManagement")). GetName ())); System.out.Println ("Certificate:" + (((Certificat) e.get ("projectManagement"). GetName ()); E.PrintStackTrace ();} Enfin {Session.Close (); EmployeeId); DeleteEmployee (EmployEid entier) {Session Session = Factory.OpenSESE (); tx.rollback (); E.PrintStackTrace (); Compiler et exécuter:
Voici les étapes pour compiler et exécuter l'application ci-dessus. Veuillez vous assurer que vous avez réglé Path et ClassPath de manière appropriée avant de compiler et d'exécuter.
Les résultats suivants seront obtenus à l'écran et les enregistrements seront créés à la fois dans les formulaires de l'employé et du certificat.
$ java managemployee
..... divers messages de journal s'afficheront ici .........
Prénom: Manoj Nom de famille: Kumar Salaire: 4000Certificate: McACertificate: Mbacertificate: PMPFirst Nom: Manoj Nom de famille: Kumar Salaire: 5000Certificate: McAcertificate: Mbacertificate: PMP
Si vous vérifiez l'employé et le formulaire de certificat, vous devez l'enregistrer:
MySQL> SELECT * à partir de l'employé;
+ ----------------------------- + ------------ + | ID | First_name | Last_name | Salaire | + -------------------------------------- + --------------- + | 60 | Manoj | Kumar | 5000 | + --------------------------------- + --------- + 1 ligne en jeu (0,00 sec)
mysql> sélectionner * dans le certificat;
+ ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Mappage à tri
TridMap est un élément stocké dans une paire de valeurs clés et fournit le type global de clés similaires aux collections Java pour les mappages. Les éléments en double ne sont pas autorisés dans la cartographie. La carte est triée dans l'ordre naturel de ses clés, ou en fournissant une comparaison généralement au moment de la création de la carte ordonnée.
Les éléments <map> et les cartes ordonnées qui triés sont mappées dans la table de mappage peuvent être initialisées dans java.util.treemap.
Nous utilisons toujours la table RDBMS et la classe POJO définie ci-dessus pour illustrer l'exemple suivant:
Définissez le fichier de mappage Hibernate:
Développer un fichier de mappage qui instruit Hibernate comment définir une classe mappée dans une table de base de données. L'élément <map> sera utilisé pour définir les règles de la carte utilisée.
<? xml version = "1.0" Encoding = "UTF-8"?> <! Doctype Hibernate-Mapping Public "- // Hibernate / Hibernate Mapping Dtd // en" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping> table = "Employee"> <meta attribut = "class-description"> Cette classe contient le détail des employés. </ meta> <id name = "id" type = "int" chronn = "id"> <générateur /> </ id> <map name = "certificats" cascade = "all" tri = "myclass"> <key column = "employee_id" /> <index column = "certificate_type" type = "string" /> <one-to-many /> </ map> <prewet name = "préfet" colonnes = "first_name" type = "string" /> <propriété name = "lastname" chronn = "last_name" type = "string" /> <propriété name = "salaire" colonnes = "salaire" type = "int" /> </ class> <class name = "certificate" table = "certificat"> <meta attribute = "class-------p"> Cette classe contient les enregistrements de certificat. </ meta> <id name = "id" type = "int" chronn = "id"> <générateur /> </ id> <propriété name = "name" colonnen = "certificate_name" type = "string" /> </ class> </ hibernate-mapping>
Le format <classname> .hbm.xml dans le fichier de mappage qui doit être enregistré. Nous enregistrons le fichier de mappage employee.hbm.xml. Déjà familier avec la plupart des détails de cartographie, mais examinons à nouveau tous les éléments du fichier de mappage:
Un document mappé est un document XML avec un élément racine de <Hibernate-Mapping> correspondant à chaque classe contenant 2 <classe>.
L'élément <scons> est utilisé pour définir un mappage spécifique de la table de base de données à partir d'une classe Java. Le nom de la classe Java spécifie l'attribut de nom de l'élément de classe et la base de données d'attribut de table Nom de la table Spécifie.
L'élément <Meta> est un élément facultatif qui peut être utilisé pour créer une description de la classe.
L'élément <id> mappe l'attribut ID unique dans la classe à la clé principale de la table de base de données. L'attribut de nom de l'élément ID fait référence à la classe de l'attribut et l'attribut de colonne fait référence aux colonnes de la table de base de données. L'attribut de type enregistre le type de mappage Hibernate, qui sera converti de Java en type de données SQL.
L'élément <générateur> dans l'élément ID est utilisé pour générer automatiquement la valeur de clé primaire. Définissez l'attribut de classe de l'élément généré pour rendre Hibernate correspondant à l'algorithme dans l'identité, la séquence ou le HILO pour créer des clés primaires en fonction des capacités de support de la base de données sous-jacente.
L'élément <propriété> est utilisé pour cartographier les propriétés d'une classe Java aux colonnes dans une table de base de données. L'attribut de nom d'un élément fait référence à la classe de l'attribut et l'attribut de colonne fait référence aux colonnes de la table de base de données. L'attribut de type enregistre le type de mappage Hibernate, qui sera converti de Java en type de données SQL.
L'élément <map> est utilisé pour définir la relation entre le certificat et la classe des employés. Nous utilisons l'élément <map> de l'attribut Cascade pour dire à Hibernate pour enregistrer l'objet de certificat, ainsi que dans l'objet employé. L'attribut de nom est défini sur la variable triée définie dans la classe parent, dans notre cas, il s'agit d'un certificat. La propriété de tri peut être définie sur le tri naturel, ou il peut être défini sur l'implémentation de classe personnalisée sous le nom de java.util. Nous avons utilisé une classe MyClass qui l'implémente sous le nom de java.util.comparator pour inverser l'ordre de tri de l'implémentation de classe de certificat.
L'élément <dex> est utilisé pour représenter la partie clé de la carte de paire de touches / valeur. Cette clé utilisera un type de chaîne stocké dans la colonne Certificate_Type.
L'élément <yey> est l'objet parent contenant une clé étrangère, c'est-à-dire la colonne de la table de certificat. Employé de table.
L'élément <o-à-many> indique qu'un objet employé implique de nombreux objets de certificat et, par conséquent, l'objet de certificat doit être associé au parent de l'employé. Vous pouvez utiliser les éléments <One-to-one>, <plusieurs-à-un> ou <plusieurs-à-à-à-mères> selon les besoins.
Si vous utilisez Sort = "Natural", nous n'avons pas besoin de créer une classe distincte, car la classe de certificat a implémenté l'interface comparable et Hibernate utilisera CompareTo dans la classe de certificat définie comme la méthode tridmap (). Cependant, nous utilisons une classe de comparaison personnalisée MyClass dans notre fichier de mappage, nous devons donc créer cette classe en fonction de notre algorithme de tri. Faisons le tri des clés disponibles sur la carte.
Importer java.util .Parator; public class MyClass implémente le comparateur <string> {public int compare (String o1, string o2) {final int avant = -1; INT final après = 1; / * Pour inverser l'ordre de tri, plusieurs par -1 * / if (o2 == null) {return avant * -1; } Comparable thisCertificate = o1; Comparable ThatCertificate = O2; if (thisCertificate == null) {return after * 1; } else if (thatCertificate == null) {return avant * -1; } else {return thisCertificate.compareto (thatCertificate) * -1; }}}Enfin, nous créerons la méthode principale () de la classe d'application pour exécuter l'application. Nous utiliserons cette application pour enregistrer certains enregistrements des employés ainsi que le certificat, puis nous soumettrons l'opération CRUD au-dessus des enregistrements.
import java.util. *; import org.hibernate.hibernateException; import org.hibernate.Session; import org.hibernate.transaction; import org.hibernate.essionfactory; import org.hibernate.cfg.configuration; classe publique managemployee {private static sessionfactory factory; public static void main (String [] args) {try {factory = new Configuration (). configure (). buildSessionFactory (); } catch (Throwable ex) {System.err.println ("Échec de la création de l'objet SessionFactory." + Ex); Jetez une nouvelle exceptionIninializizerError (ex); } ManageMloyee me = new ManageMloyee (); / * Avons un ensemble de certificats pour le premier employé * / Treemap set1 = new Treemap (); set1.put ("ordinateur", nouveau certificat ("MCA")); set1.put ("BusinessManagement", nouveau certificat ("MBA")); set1.put ("projectmanagement", nouveau certificat ("pMP")); / * Ajouter des enregistrements des employés dans la base de données * / Integer empid1 = me.addemployee ("manoj", "kumar", 4000, set1); / * Un autre ensemble de certificats pour le deuxième employé * / Treemap set2 = new Treemap (); set2.put ("ordinateur", nouveau certificat ("MCA")); set2.put ("BusinessManagement", nouveau certificat ("MBA")); / * Ajouter un autre enregistrement des employés dans la base de données * / Integer Empid2 = me.addemployee ("dilip", "kumar", 3000, set2); / * Énumérez tous les employés * / me.listEmployee (); / * Mettre à jour les dossiers salariaux de l'employé * / me.updateEmployee (EMPID1, 5000); / * Supprimer un employé de la base de données * / me.DeleteEmployee (EMPID2); / * Énumérez tous les employés * / me.ListEmployees (); }! Transaction tx = null; EmployeeId entier = null; try {tx = session.begintransaction (); Employé employé = nouvel employé (FNAME, LNAME, SALAIRE); Employee.SetCertificates (CERT); EmployeeId = (entier) Session.Save (employé); tx.Commit (); } catch (hibernateException e) {if (tx! = null) tx.rollback (); e.printStackTrace (); } enfin {session.close (); } return EmployeeId; }! Transaction tx = null; try {tx = session.begintransaction (); Lister les employés = session.CreateeQuey ("From Employee"). List (); pour (iterator iterator1 = employés.iterator (); iterator1.hasnext ();) {employee employé = (employé) iterator1.next (); System.out.print ("prénom:" + employee.getFirstName ()); System.out.print ("nom de famille:" + employee.getLastName ()); System.out.println ("Salaire:" + employee.getsalary ()); TridMap <String, Certificate> Map = Employee.GetCertificates (); pour (map.entry <string, certificat> entrée: map.entryset ()) {System.out.print ("/ tcertificate Type:" + Entry.getKey ()); System.out.println (", nom:" + (entry.getValue ()). GetName ()); }} tx.Commit (); } catch (hibernateException e) {if (tx! = null) tx.rollback (); e.printStackTrace (); } enfin {session.close (); }} / * Méthode pour mettre à jour le salaire pour un employé * / public void updateEmployee (entier EmployeeId, int salaire) {session session = factory.opencession (); Transaction tx = null; try {tx = session.begintransaction (); Employé employé = (employé) session.get (employee.class, employeeId); Employee.SetSalary (salaire); Session.Update (employé); tx.Commit (); } catch (hibernateException e) {if (tx! = null) tx.rollback (); e.printStackTrace (); } enfin {session.close (); }} / * Méthode pour supprimer un employé des dossiers * / public void DeleteEmployee (EmployeeId entier) {session session = factory.opencession (); Transaction tx = null; try {tx = session.begintransaction (); Employé employé employé = (employé) session.get (employee.class, employeeId); session.delete (employé); tx.Commit (); } catch (hibernateException e) {if (tx! = null) tx.rollback (); e.printStackTrace (); } enfin {session.close (); }}} Compiler et exécuter:
Vous pouvez voir que les certificats ont été triés dans l'ordre opposé. Vous pouvez l'essayer en modifiant le fichier de mappage, il suffit de définir tri = "naturel" et d'exécuter le programme et de comparer les résultats.
$ java managemployee
..... Divers messages de journal s'affichera ici ......... Prénom: Manoj Nom de famille: Kumar Salaire: 4000 Type de certificat: ProjectManagement, Nom: PMP Type de certificat: Ordinterscience, Nom: MCA Type de certificat: BusinessManagement, Nom: MBAFIRST NOM: Dilip Nom: Kumar BusinessManain Salaire de Kumar: 5000 Type de certificat: ProjectManagement, nom: PMP Type de certificat: ordinateur, nom: MCA Type de certificat: BusinessManagement, nom: MBA
Si vous vérifiez l'employé et le formulaire de certificat, vous devez l'enregistrer:
MySQL> SELECT * à partir de l'employé;
+ ---- + -------------------- + --------- + | ID | First_name | Last_name | Salaire | + ------------------------------------ + ------------- + ------------ + | 74 | Manoj | Kumar | 5000 | + -------------------------------- + --------- + 1 ligne en jeu (0,00 sec)
mysql> sélectionner * dans le certificat;
+ ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------