Le mappage de clé primaire composite nécessite l'utilisation de la balise <Composite-ID> dans le fichier de configuration de mappage. Cette balise fait référence à la spécification d'une classe en tant que clé primaire composée correspondante. Son attribut de nom doit spécifier la valeur de propriété définie dans le fichier de classe et ajouter le sous-étiquette <key-property> à la balise.
Remarque: Si vous souhaitez utiliser le mappage composite, vous devez placer la clé primaire composite dans une classe, c'est-à-dire que les attributs de clé primaire composites et autres attributs sont divisés en deux classes, et la classe de clé primaire composite implémente l'interface sérialisable, qui appartient à Java.io.
La clé primaire de la relation de mappage de la clé primaire composite est composée de plusieurs colonnes, ce qui correspond assez simple au tableau de données, comme le montre la figure ci-dessous:
1. Fichiers de classe
Ici, nous prenons le tableau dans la figure ci-dessus comme exemple. Dans le tableau, deux champs et durées se combinent pour former la clé primaire du tableau. Par conséquent, les nouvelles classes divisées sont nommées respectivement FiscaliyEarperiod et FiscaliyEarperiodpk. Parmi eux, la classe FiscaliyEarperiod résume les attributs de clé primaire du tableau, la classe FiscaliyEarperiod résume d'autres attributs et la classe FiscaliyEarperiod.
1.1 Fiscalinyearperiod.java
La classe encapsule les propriétés de base et résume la classe FiscAlyEarperiodpk comme attributs dans la classe et configure le mappage correspondant dans le fichier de configuration, comme suit:
package com.src.hibernate; import java.sql.date; classe publique FiscalinyEarperiod {// Time Clé primaire Private FiscAlyEarperiodpk Fiscalisearperiodpk; public fiscalinyearperiodpk getFiscalinyEarperiodpk () {return fiscalinyearperiodpk; } public void setFiscCalinyEarperiodpk (fiscaliyearperiodpk fisccAlyearperiodpk) {this.fiscalinyearperiodpk = fisccALYearperiodpk; } // Date de début Date privée Begindate; Date publique getbeGindate () {return Begindate; } public void setBegindate (date Begindate) {this.begindate = begindate; } // Date de fin Date privée EndDate; Date publique getEndDate () {return EndDate; } public void setendDate (date EndDate) {this.enddate = endDate; } // Temps de scène Private String Periodsts; public String getperiodsts () {return periodsts; } public void setperiodsts (chaîne periodsts) {this.periodsts = periodsts; }} 1.2 FiscAlyearperiodpk.java
Encapsuler l'attribut de clé primaire. Cette classe est séparée de la classe FiscalinyEarperiod. Il contient les attributs de clé primaire de base et doit implémenter la sérialisable d'interface. Cette classe doit être mappée sur la balise <Composite-ID> dans le fichier de configuration pour spécifier la classe. Le code est le suivant:
package com.src.hibernate; import java.io.serializable; classe publique FiscalinyEarperiodpk implémente sérialisable {// année privée int Fiscalinyear; public int getFiscalinyear () {return fiscalinyear; } public void setFiscCalinyear (int Fiscalinyear) {this.fiscalinyear = fiscalinyear; } // durée privée int budpiscalperiod; public int getFiscalperiod () {return fiscalperiod; } public void setFiscalperiod (int fiscalperiod) {this.fiscalperiod = fiscalperiod; }} 2. Fichier de configuration
Voici une question laquelle des deux classes doit ajouter des fichiers de mappage? Étant donné que la balise <composite-id> est utilisée, il vous suffit d'ajouter un mappage pour la classe FiscAlyEarperiod, d'ajouter la balise de clé primaire composite correspondante au fichier de mappage et d'ajouter les attributs de clé primaire correspondants à la balise, comme suit:
<? xml version = "1.0"?> <! Doctype Hibernate-Mapping public "- // Hibernate / Hibernate Mapping Dtd 3.0 // en" "http://hibernate.sourceforge> <hibernate-mapp name = "com.src.hibernate.fisccalyearperiod" table = "t_fiscal_year_period_pk"> <composite-id name = "fiscAlyearpk"> <key-property name = "fiscAlyear"> </ key-property> <key-property name = "fiscalperiod"> </ key-property> type = "date" /> <propriété name = "enddate" type = "date" /> <propriété name = "enddate" type = "date" /> <propriété name = "periodsts" /> </ class> </ hibernate-mapping>
Le fichier ci-dessus est généré pour générer la table de base de données correspondante, et l'instruction SQL générée est la suivante:
Table de dépôt si existe t_fiscal_year_period_pk créer la table t_fiscal_year_period_pk (entier fisccalyear et non nulle, entier fiscalperiod non nul, date de début, date financier)
La structure de table correspondante est la suivante:
3. Fonctionnement des données
Une fois le fichier de mappage correspondant configuré, l'opération de données correspondante devient très simple. Tout d'abord, commencez par écrire des données. Lors de la rédaction de données dans la base de données, deux classes seront écrites dans la base de données en même temps. Par conséquent, les deux classes doivent être converties en état transitoire. Par conséquent, lors de l'enregistrement, vous devez d'abord enregistrer d'abord l'objet FiscAlyEarperiod dans la base de données, puis il associe automatiquement les attributs composites et enregistrera les informations dans la base de données.
3.1 Opération d'écriture
La méthode d'opération d'écriture est la même que la méthode d'écriture précédente. Vous devez définir deux objets, puis enregistrer les informations d'objet correspondantes dans la base de données. Le code est le suivant:
public void testsave1 () {// Déclare la session d'objet de session Session Session = NULL; essayez {// Obtenez la session d'objet de session = hibernateutils.getSession (); // Ouvre la session Session.beginTransaction (); // Créez l'objet composite fiscalinyearperiodpk fiscalinyearperiodpk = new fiscalinyearperiodpk (); Fiscalinyearperiodpk.setFiscalperiod (2014); Fiscalinyearperiodpk.setFiscalinyEaryear (2012); // Créer l'objet FiscalinyEarperiod FiscalinyEarperiod = new FiscAlyEarperiod (); fiscalinyearperiod.setFiscCalyarperiodpk (fiscalisearperiodpk); Session.Save (FiscalinyEarperiod); // Soumettre la session de session Session.getTransaction (). Commit (); } catch (exception e) {e.printStackTrace (); session.getTransaction (). Rollback (); } enfin {hibernateUtils.closeSession (session); }}Exécuter la méthode de test correspondante et l'instruction SQL générée est la suivante:
Hibernate: insert into t_fiscal_year_period_pk (beginDate, endDate, periodSts, fiscalYear, fiscalPeriod) values (?, ?, ?, ?, ?) La vue de base de données correspondante:
3.2 Fonctionnement de chargement
La méthode de chargement correspondante sera différente d'AVANT, car la clé principale du tableau est une propriété composée, donc une classe doit être créée. Lorsque vous chargez des données, vous devez créer un objet de clé primaire. Pour le moment, la clé principale est un objet, et vous devez attribuer des valeurs aux propriétés de l'objet pour obtenir l'objet. Le code est le suivant:
public void testload1 () {// Déclare la session d'objet de session Session Session = NULL; essayez {// Obtenez la session d'objet de session = hibernateutils.getSession (); // Ouvre la session Session.beginTransaction (); // Créez l'objet composite fiscalinyearperiodpk fiscalinyearperiodpk = new fiscalinyearperiodpk (); Fiscalinyearperiodpk.setFiscalperiod (2014); Fiscalinyearperiodpk.setFiscalinyear (2012); FiscalinyEarperiod fisccalinyearperiod = (fisccAlyearperiod) Session.load (fiscalinyearperiod.class, fiscalisearperiodpk); System.out.println ("Date de début:" + FiscAlyEarperiod.getBegIndate ()); // Soumettre session session.getTransaction (). Commit (); } catch (exception e) {e.printStackTrace (); session.getTransaction (). Rollback (); } enfin {hibernateUtils.closeSession (session); }}Le résultat est le suivant:
Hibernate: Sélectionnez Fiscalinyear0_.FiscCalinyear en tant que Fiscalinyear0_0_, FiscAlyear0_.Fiscalperiod as Fiscalpe2_0_0_, Fisccalyear0_.begindate As Begindate0_0_, FiscALYEAR0_ t_fiscal_year_period_pk fiscAlyear0_ où fiscalinyear0_.fiscCalyar =? et fiscalinyear0_.fiscalperiod =? Date de début: 2013-10-12
4. Exemples complets
Un tableau de département d'une plus grande entreprise (Hibernate_dept_CompositEpk) se compose de champs tels que la zone (zone), le nom du département (nom), le nombre de personnes dans le département (Empcount) et le temps d'établissement (anniversaire). Nous utilisons la zone et le nom du département comme clé principale conjointe:
4.1 Classe cible: département.java
Département de classe publique {/ ** Résumé l'attribut d'association de clé primaire et l'écrivez-le dans une classe séparément * // zone de chaîne privée; // Nom de chaîne privée; / ** Préparation de l'objet de classe de clé primaire en tant que variable membre * / Département privé de départementpkpk; privé int empcount; anniversaire de rendez-vous privé; // public String getarea () {// zone de retour; //} // // public void setarea (zone de chaîne) {// this.area = zone; //} // // public String getName () {// Nom de retour; //} // // public void setName (String name) {// this.name = name; //} public int getEmpCount () {return EmpCount; } public void SetEmpCount (int empcount) {this.empcount = empcount; } Public Date getBirthday () {retour anniversaire; } public void SetBirthday (date d'anniversaire) {this.birthday = anniversaire; } Public DepartmentPk GetDepartmentPk () {return DepartmentPk; } public void setDartmentPk (DepartmentPk DepartmentPk) {this.departmentpk = DepartmentPk; }} 4.2 Classe de clé primaire: Departmentpk.java
Classe publique DepartmentPk implémente Serializable {private statique final long SerialVersionUID = -288002855915204255L; zone de chaîne privée; nom de chaîne privé; / ** * Écraser la méthode HashCode (jugé basé sur la zone et le nom) * / // @ Override public int hashcode () {final int prime = 31; Int résultat = 1; result = prime * Result + ((zone == null)? 0: area.hashcode ()); result = prime * result + ((name == null)? 0: name.hashcode ()); Résultat de retour; } / ** * Écraser égaux (jugé en fonction de la zone et du nom) * / @Override public boolean equals (objet obj) {if (this == obj) return true; if (obj == null) return false; if (getClass ()! = obj.getClass ()) return false; Département final PLUS AUTRES = (DepartmentPk) OBJ; if (area == null) {if (other.area! = null) return false; } else if (! Area.equals (autre.Area)) renvoie false; if (name == null) {if (autre.name! = null) return false; } else if (! name.equals (autre.name)) renvoie false; Retour Vrai; } public String getArea () {Retour Area; } public void setarea (zone de chaîne) {this.area = zone; } public String getName () {Nom de retour; } public void setName (string name) {this.name = name; }} 4.3 Mapping File Department.hbm.xml
<? xml version = "1.0"?> <! Doctype Hibernate-Mapping public "- // Hibernate / Hibernate Mapping Dtd 3.0 // en" "http://hibernate.sourceforge> <hibernate-mapp name = "com.yangfei.hibernate.composepk.entity.department" table = "hibernate_dept_compositepk"> <! - Union primaire key -> <! - Le nom fait référence aux attributs d'objets de clé primaire -> <composite-id name = "Departmentpk"> <! - Ici est la principale association de la clé " </ composite-id> <! - Autres propriétés -> <propriété name = "empcount" length = "4" /> <propriété name = "anniversaire" type = "date" /> </ class> </ hibernate-mapping>
4.4 Fichier de configuration Hibernate Hibernate.cfg.xml
<? xml version = '1.0' Encoding = 'UTF-8'?> <! Doctype Hibernate-Configuration Public "- // Hibernate / Hibernate Configuration DTD 3.0 // en" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <! Outils. -> <hibernate-configuration> <session-factory> <propriété name = "dialect"> org.hibernate.dialect.oracle9dialect </ propriété> <propriété name = "connection.url"> jdbc: oracle: mince: @ 127.0.0. name = "connection.password"> yf123 </ propriété> <propriété name = "connection.driver_class"> oracle.jdbc.driver.oracledriver </ propriété> <propriété name = "hibernate.show_sql"> true </ propriété> <mapping ressource = "com / yangfei / hibernate / CompositEpk / entity / Department.hb." />>> ENTERNE </ session-factory> </ hibernate-configuration>
4.5 Classe de test: Departmenttest.java
La classe publique DepartmentTest étend TestCase {/ ** * Test Insérer des données * / public void Save () {Session Session = HiberNateUtils.getSession (); Transaction t = session.begintransaction (); essayez {Department Dept = New Department (); / ** Générer l'objet de clé primaire * / DepartmentPk Deptpk = new Dep undepvenPk (); deptpk.setArea ("Beijing"); deptpk.setName ("département R&D"); dept.setDepartmentPk (DeptPk); Dept.sempCount (100); Dept.setBirthday (new Date ()); Session.Save (Dept); T.Commit (); } catch (hibernateException e) {e.printStackTrace (); t.rollback (); } enfin {hibernateUtils.closeSession (session); }} / ** * Tester les données de chargement * / public void charge () {session session = hibernateUtils.getSession (); Transaction t = session.begintransaction (); essayez {/ ** générer un objet de clé primaire * / DepartmentPk Deptpk = new Dep undepvenPk (); deptpk.setArea ("Beijing"); deptpk.setName ("département R&D"); Département du département = (département) Session.Load (Department.Class, DeptPK); System.out.println (Dept.getDepartmentPk (). Getarea () + "," + dept.getDartmentPk (). GetName () + "," + dept.getEmpcount () + "," + Dept.getBirtHday ()); } catch (hibernateException e) {e.printStackTrace (); t.rollback (); } enfin {hibernateUtils.closeSession (session); }} / ** * Données de modification de test * / public void Update () {session session = hibernateutils.getSession (); Transaction t = session.begintransaction (); essayez {/ ** générer un objet de clé primaire * / DepartmentPk Deptpk = new Dep undepvenPk (); deptpk.setArea ("Beijing"); deptpk.setName ("département R&D"); Department EMP = (Department) Session.load (Department.Class, DeptPK); System.out.println (emp.getDepartmentPk (). Getarea () + "," + emp.getDepartmentPk (). GetName () + "," + emp.getEmpcount () + "," + emp.getBirthday ()); Emp.SetEmpCount (100); Session.SaveorUpdate (EMP); / ** Générer l'objet de clé primaire * / DepartmentPk Deptpk2 = new Dep undeurpk (); deptpk2.setArea ("Beijing"); deptpk2.setName ("DUSTRAPE R&D"); Département du ministère = (département) Session.Load (Department.Class, DeptPK2); System.out.println (Dept.getDepartmentPk (). Getarea () + "," + dept.getDartmentPk (). GetName () + "," + dept.getEmpcount () + "," + Dept.getBirtHday ()); T.Commit (); } catch (hibernateException e) {e.printStackTrace (); t.rollback (); } enfin {hibernateUtils.closeSession (session); }} / ** * Tester la suppression des données * / public void delete () {session session = hibernateutils.getSession (); Transaction t = session.begintransaction (); essayez {/ ** générer un objet de clé primaire * / DepartmentPk Deptpk = new Dep undepvenPk (); deptpk.setArea ("Beijing"); deptpk.setName ("département R&D"); Département du département = (département) Session.Load (Department.Class, DeptPK); Session.Delete (Dept); T.Commit (); } catch (hibernateException e) {e.printStackTrace (); t.rollback (); } enfin {hibernateUtils.closeSession (session); }}}