Das zusammengesetzte Primärschlüssel-Zuordnung erfordert die Verwendung des <Composite-ID> -Tags in der Mapping-Konfigurationsdatei. Dieses Tag bezieht sich auf die Angabe einer Klasse als entsprechende zusammengesetzte Primärschlüssel. Das Namensattribut muss den in der Klassendatei definierten Eigenschaftswert angeben und das Sub-Label <Key-Property> zum Tag hinzufügen.
Hinweis: Wenn Sie das zusammengesetzte Mapping verwenden möchten, müssen Sie den zusammengesetzten Primärschlüssel in einer Klasse, dh, die zusammengesetzten Primärschlüsselattribute und andere Attribute in zwei Klassen unterteilt, und die zusammengesetzte Klasse implementiert die serialisierbare Schnittstelle, die zu Java.io gehört.
Der Primärschlüssel der Zuordnungsbeziehung des zusammengesetzten Primärschlüssels besteht aus mehreren Spalten, die der Datentabelle recht einfach entsprechen, wie in der folgenden Abbildung gezeigt:
1. Klassendateien
Hier nehmen wir die Tabelle in der obigen Abbildung als Beispiel. In der Tabelle verbinden sich zwei Felder und Dauer, um den Primärschlüssel der Tabelle zu bilden. Daher werden die neuen Klassen geteilt als Fiscalyearperiode bzw. Fiscalyearperiodpk bezeichnet. Unter ihnen verringert die Fiscalyearperiod -Klasse die primären Schlüsselattribute der Tabelle, die fiscalyearearperiode -Klasse verkauft andere Attribute und die Fiscalyearperiod -Klasse.
1.1 fiscalyearperiode.java
Die Klasse verkauft grundlegende Eigenschaften und verkauft die fiscalyeArperiodPK -Klasse als Attribute in die Klasse und konfiguriert die entsprechende Zuordnung in der Konfigurationsdatei wie folgt:
Paket com.src.hibernate; import Java.sql.date; öffentliche Klasse Fiscalyearperiode {// Zeit Hauptschlüssel Private Fiscalyearperiodpk Fiscalyearperiodpk; public fiscalyearperiodpk getfiscalyearperiodpk () {return fiscalyearperiodpk; } public void setfiscalyearperiodpk (fiscalyearperiodpk fiscalyearperiodpk) {this.fiscalyearperiodpk = fiscalyearperiodpk; } // Start Datum Private Datum Begindate; public date getBegindate () {return Begindate; } public void setBegindate (Datum Begindate) {this.Begindate = Begindate; } // Enddatum Private Datum Enddate; public date getendDate () {Enddate zurückgeben; } public void setendDate (Datum Enddate) {this.endDate = EndDate; } // Stage Time Private String Periodests; public String getPeriodSts () {Rückgabeperioden; } public void setperiodsts (String Periodests) {this.periodsts = periiolen; }} 1.2 Fiscalyearperiodpk.java
Kapitulieren Sie das Primärschlüsselattribut. Diese Klasse ist von der fiscalyeareArperiod -Klasse getrennt. Es enthält die grundlegenden primären Schlüsselattribute und muss die serialisierbare Schnittstelle implementieren. Diese Klasse ist in der Konfigurationsdatei dem <Composite-ID> -Tag zu kartieren, um die Klasse anzugeben. Der Code ist wie folgt:
Paket com.src.hibernate; importieren java.io.serializable; öffentliche Klasse Fiscalyearperiodpk implementiert serialisierbar {// Jahr Private int fiscalyear; public int getfiscalyear () {return fiscalyear; } public void setfiscalyear (int fiscalyear) {this.fiscalyear = fiscalyear; } // Dauer private int fiscalperiod; public int getfiscalperiod () {return fiscalperiod; } public void setfiscalperiod (int fiscalperiod) {this.fiscalperiod = fiscalperiod; }} 2. Konfigurationsdatei
Hier ist eine Frage, welche der beiden Klassen zum Hinzufügen von Zuordnungsdateien muss? Da das <Composite-ID> -Tag verwendet wird, müssen Sie nur eine Zuordnung für die fiscalyeareArPeriod-Klasse hinzufügen, das entsprechende zusammengesetzte Primärschlüssel-Tag in die Zuordnungsdatei hinzufügen und die entsprechenden Primärschlüsselattribute wie folgt zum Tag hinzufügen:
<? name = "com.src.hibernate.fiscalyearerPeriod" table = "t_fiscal_year_period_pk"> <Composite-ID Name = " type = "Datum"/> <Eigenschaft name = "enddate" type = "date"/> <Eigenschaft name = "enddate" type = "Datum"/> <Eigenschaft name = "periodsts"/> </class> </hibernate-Mapping>
Die obige Datei wird generiert, um die entsprechende Datenbanktabelle zu generieren, und die generierte SQL -Anweisung lautet wie folgt:
Droptabelle Wenn existiert T_FISCAL_YEAR_PERIOD_PK TABLE T_FISCAL_YEAR_PERIOD_PK (Fiscalyear Integer nicht NULL, FISCALPERIODE Ganzzahl nicht NULL, Begindate Datum, Enddatum, Periodsts Varchar (255), Primärschlüssel (fiscalyear, fiscalperiod)))
Die entsprechende Tabellenstruktur lautet wie folgt:
3. Datenbetrieb
Nachdem die entsprechende Zuordnungsdatei konfiguriert wurde, wird die entsprechende Datenoperation sehr einfach. Beginnen Sie zunächst mit dem Schreiben von Daten. Beim Schreiben von Daten in die Datenbank werden gleichzeitig zwei Klassen in die Datenbank geschrieben. Daher müssen beide Klassen in einen vorübergehenden Zustand umgewandelt werden. Beim Speichern müssen Sie zuerst zuerst das fiscalyeArperiod -Objekt in der Datenbank speichern und dann die zusammengesetzten Attribute automatisch in Verbindung bringen und die Informationen in der Datenbank speichern.
3.1 Operation schreiben
Die Schreibbetriebsmethode entspricht der vorherigen Schreibmethode. Sie müssen zwei Objekte definieren und dann die entsprechenden Objektinformationen in der Datenbank speichern. Der Code ist wie folgt:
public void testsave1 () {// deklarieren Sie die Sitzungsobjekt -Sitzung Session = null; Versuchen Sie {// Die Sitzungsobjekt -Sitzung = hibernateUtils.getSession () erhalten; // öffnen Sie die Sitzungssitzung.BeginTransaction (); // Erstellen Sie das zusammengesetzte Objekt fiscalyearperiodpk fiscalyearperiodpk = new fiscalyearperiodpk (); fiscalyearperiodpk.setfiscalperiod (2014); fiscalyearperiodpk.setfiscalyearyear (2012); // Erstellen Sie das Objekt fiscalyearperiod fiscalyearperiode = new fiscalyearperiode (); fiscalyearperiod.setfiscalyearperiodpk (fiscalyearperiodpk); Sitzung.Save (Fiscalyearperiode); // Sitzungssitzung Sentre Sentre Session.getTransaction (). Commit (); } catch (Ausnahme e) {e.printstacktrace (); Session.Gettransaction (). Rollback (); } endlich {HibernateUtils.Closession (Sitzung); }}Führen Sie die entsprechende Testmethode aus, und die generierte SQL -Anweisung lautet wie folgt:
Hibernate: insert into t_fiscal_year_period_pk (beginDate, endDate, periodSts, fiscalYear, fiscalPeriod) values (?, ?, ?, ?, ?) Die entsprechende Datenbankansicht:
3.2 Ladevorgang
Die entsprechende Lademethode unterscheidet sich von zuvor, da der Primärschlüssel in der Tabelle eine zusammengesetzte Eigenschaft ist, daher muss eine Klasse erstellt werden. Beim Laden von Daten müssen Sie ein primäres Schlüsselobjekt erstellen. Zu diesem Zeitpunkt ist der Primärschlüssel ein Objekt, und Sie müssen den Eigenschaften des Objekts Werte zuweisen, um das Objekt zu erhalten. Der Code ist wie folgt:
public void testload1 () {// deklarieren Sie die Sitzungsobjektsitzung Session = NULL; Versuchen Sie {// Die Sitzungsobjekt -Sitzung = hibernateUtils.getSession () erhalten; // öffnen Sie die Sitzungssitzung.BeginTransaction (); // Erstellen Sie das zusammengesetzte Objekt fiscalyearperiodpk fiscalyearperiodpk = new fiscalyearperiodpk (); fiscalyearperiodpk.setfiscalperiod (2014); fiscalyearperiodpk.setfiscalyear (2012); Fiscalyearperiode fiscalyearperiode = (fiscalyearperiod) Sitzung (fiscalyearperiod.class, fiscalyearperiodpk); System.out.println ("Startdatum:"+fiscalyearperiod.getBegindate ()); // Sitzungssitzung einreichen. } catch (Ausnahme e) {e.printstacktrace (); Session.Gettransaction (). Rollback (); } endlich {HibernateUtils.Closession (Sitzung); }}Das Ergebnis ist wie folgt:
Hibernate: select fiscalyear0_.fiscalYear as fiscalYear0_0_, fiscalyear0_.fiscalPeriod as fiscalPe2_0_0_, fiscalyear0_.beginDate as beginDate0_0_, fiscalyear0_.endDate as endDate0_0_, fiscalyear0_.periodSts as periodSts0_0_ from t_fiscal_year_period_pk fiscalyear0_ wo fiscalyear0_.fiscalyear =? und fiscalyear0_.fiscalperiod =? Startdatum: 2013-10-12
4. umfassende Beispiele
Eine Abteilungstabelle eines größeren Unternehmens (Hibernate_Dept_compositepk) besteht aus Feldern wie dem Bereich (Bereich), dem Namen (Name) der Abteilung (Name), der Anzahl der Personen in der Abteilung (EMPCOUNT) und der Einrichtungszeit (Geburtstag). Wir verwenden den Gebiet und den Abteilungsnamen als gemeinsamer Primärschlüssel:
4.1 Zielklasse: Abteilung.java
Abteilung für öffentliche Klasse { /** Zusammenfassung Das Attribut "Primärschlüssel" und schreiben Sie es separat in eine Klasse*// Private String Area; // privater Zeichenfolge Name; / ** Vorbereitung des Objekts der Primärschlüsselklasse als Mitgliedsvariable*/ private AbteilungPK DepartmentPK; Privat int Empcount; Privatdatum Geburtstag; // public String getArea () {// Rückkehrbereich; //} // // public void setArea (String Area) {// this.area = ase; //} // // public String getName () {// return name; //} // // public void setName (String -Name) {// this.name = name; //} public int getEMPCount () {return empCount; } public void setEmpCount (int empCount) {this.eMPCount = EmpCount; } public date getBirthday () {Return Birthday; } public void setBirthday (Datum Geburtstag) {this.birthday = Geburtstag; } Public DepartmentPK getDepartmentpk () {return DepartmentPK; } public void setDepartmentpk (AbteilungPK) {this.Departmentpk = Abteilungpk; }} 4.2 Primärschlüsselklasse: Abteilungpk.java
öffentliche Klasse DepartmentPK implementiert serialisierbar {private statische endgültige long serialversionuid = -288002855915204255L; privates Saitenbereich; privater Zeichenfolge Name; /** * HashCode -Methode überschreiben (nach Gebiet und Name beurteilt) *///@überschreiben öffentliche int HashCode () {Final int Prime = 31; int result = 1; result = prime * result + ((Area == NULL)? 0: Area.hashCode ()); result = prime * result + ((name == null)? 0: name.hashcode ()); Rückgabeergebnis; } / ** * Überschreibe gleich (nach Gebiet und Name beurteilt) * / @Override public boolean Equals (Objekt obj) {if (this == obj) return true; if (obj == null) return false; if (getClass ()! = obj.getClass ()) return false; endgültige Abteilung andere = (Abteilung) obj; if (Area == null) {if (other.Area! = null) return false; } else if (! Area.equals (other.Area)) return false; if (name == null) {if (other.name! = null) return false; } else if (! name.equals (other.name)) return false; zurückkehren; } public String getArea () {Return Area; } public void setArea (String Area) {this.Area = area; } public String getName () {return name; } public void setName (String -Name) {this.name = name; }} 4.3 Zuordnungsdateiabteilung.hbm.xml
<? name = "com.yangfei.hibernate.compositepk.entity.Department" table = "hibernate_dept_compositepk"> <!-Union Primärschlüssel-> <!-Name bezieht sich auf Primärschlüssel-Objektattribute-> <Composite-id Name "Abteilung </composite-id> <!-Andere Eigenschaften-> <Eigenschaft name = "empCount" Länge = "4"/> <Property name = "Geburtstag" type = "Date"/> </class> </hibernate-mapping>
4.4 Hibernate -Konfigurationsdatei Hibernate.cfg.xml
<? Werkzeuge. -> <Hibernate-Configuration> <Session-Factory> <Eigenschaft name = "Dialekt"> org.hibernate.dialect.oracle9Dialect </Property> <Eigenschaft name = "connection.url"> jdbc: oracle: dünn:@127.0.1: 1521: orcl10 </property> connection name = "connection.password"> yf123 </Property> <Eigenschaft name = "connection.driver_class"> oracle.jdbc.driver.oracledriver </Property> <Property name = "hibernate.show_sql"> true </property> <maping ressource </Session-Factory> </Hibernate-Konfiguration>
4.5 Testklasse: Abteilungstest.java
public class Departmenttest erweitert testCase { / *** TEST -INSERT -Daten* / public void SAVE () {Session Session = hibernateUtils.getSession (); Transaktion t = Session.beginTransaction (); try {Abteilungsabteilung = neue Abteilung (); / ** Primärschlüsselobjekt generieren*/ maptpk Deptpk = new DepartmentPK (); Deptpk.setArea ("Peking"); Deptpk.SetName ("F & E -Abteilung"); Dept.SetDepartmentpk (Deptpk); Dept.SetEMPCount (100); Dept.SetBirthday (neues Datum ()); Sitzung.Save (Abteilung); T.Commit (); } catch (hibernateException e) {e.printstacktrace (); t.rollback (); } endlich {HibernateUtils.Closession (Sitzung); }} / *** Testen Sie Lastdaten* / public void load () {session session = hibernateUtils.getSession (); Transaktion t = Session.beginTransaction (); Versuchen Sie { / ** Primärschlüsselobjekt* / maptpk deptpk = new DepartmentPK (); Deptpk.setArea ("Peking"); Deptpk.SetName ("F & E -Abteilung"); Abteilung Abteilung = (Abteilung) Sitzung.load (Abteilung.Class, Deptpk); System.out.println (Dept.getDepartmentpk (). GetArea ()+","+Dept.getDepartmentpk (). GetName ()+","+dept.getempcount ()+","+Dept.getbirthday ()); } catch (hibernateException e) {e.printstacktrace (); t.rollback (); } endlich {HibernateUtils.Closession (Sitzung); }} / *** Änderungsmodifikationsdaten* / public void update () {Session Session = hibernateUtils.getSession (); Transaktion t = Session.beginTransaction (); Versuchen Sie { / ** Primärschlüsselobjekt* / maptpk deptpk = new DepartmentPK (); Deptpk.setArea ("Peking"); Deptpk.SetName ("F & E -Abteilung"); Abteilung emp = (Abteilung) Sitzung.load (Abteilung.Class, Deptpk); System.out.println (Emp.GetDepartmentpk (). GetArea ()+","+emp.getDepartmentpk (). Emp.SetempCount (100); Session.SaveorUpdate (EMP); / ** Primärschlüsselobjekt generieren*/ maptpk Deptpk2 = new DepartmentPK (); Deptpk2.SetArea ("Peking"); Deptpk2.SetName ("F & E -Abteilung"); Abteilungsabteilung = (Abteilung) Sitzung.load (Abteilung.Class, Deptpk2); System.out.println (Dept.getDepartmentpk (). GetArea ()+","+Dept.getDepartmentpk (). GetName ()+","+dept.getempcount ()+","+Dept.getbirthday ()); T.Commit (); } catch (hibernateException e) {e.printstacktrace (); t.rollback (); } endlich {HibernateUtils.Closession (Sitzung); }} / *** Testen Sie Daten löschen* / public void delete () {session session = hibernateUtils.getSession (); Transaktion t = Session.beginTransaction (); Versuchen Sie { / ** Primärschlüsselobjekt* / maptpk deptpk = new DepartmentPK (); Deptpk.setArea ("Peking"); Deptpk.SetName ("F & E -Abteilung"); Abteilung Abteilung = (Abteilung) Sitzung.load (Abteilung.Class, Deptpk); Sitzung.Delete (Abteilung); T.Commit (); } catch (hibernateException e) {e.printstacktrace (); t.rollback (); } endlich {HibernateUtils.Closession (Sitzung); }}}