Als ORM -Framework muss Hibernate auch unsere Bedürfnisse zur Implementierung des Zusammenhangs zwischen Tabellen erfüllen. Die Implementierung von Winterschlaf in der Assoziationsmethode ist sehr einfach. Schauen wir uns den Einzeluntergang an:
Lassen Sie uns ohne weiteres den Code hochladen:
Zwei Entitätsklassen, Tuser und Tasssport:
öffentliche Klasse Tuser implementiert serialisierbar {private statische endgültige long serialversionuid = 1l; private int id; privates int Alter; privater Zeichenfolge Name; privater Tassportpass; // GET/SET -Methode weglassen} öffentliche Klasse Tassport implementiert serialisierbar {private statische endgültige long serialversionuid = 1l; private int id; private String -Serie; private int -Ablauf; privater Touser -Benutzer; // Get/Set -Methode auslassen}Schauen wir uns die Unterschiede zwischen Zuordnungsdateien an:
<hibernate-mapping package = "org.hiberNate.tutorial Column = "Alter"/> <Eins-zu-Eins-Name = "passport" cascade = "all" outer-join = "true"/> </class> </hibernate-Mapping>
Hier sehen wir ein neues Etikett, eins zu eins, das zeigt, dass die aktuelle Klasse und die entsprechende Klasse eins zu eins sind. Cascade ist eine Kaskadenbeziehung. Alles zeigt, dass TPASPORPT auch, wie die Situation ist, bei der Arbeit in der Touser-Klasse auch entsprechende Operationen ausführt. Outer-Join bezieht sich darauf, ob die äußere Join-Erklärung verwendet werden soll.
Schauen wir uns eine andere Tassport -Mapping -Datei an:
<hibernate-mapping package = "org.hiberNate.tutorial name = "expiry" type = "java.lang.Ineger" column = "expiry"/> <eins zu eins Name = "Benutzer" Constierte = "true"/> </class> </hibernate-mapping>
Hier konzentrieren wir uns auf den Klassenwert des Generators. Es gibt den Referenz -Fremdschlüssel für Fremdkörper an und welche Referenz durch Param angeben wird, wodurch die ID der Referenzbenutzerklasse angibt. Es gibt eine zusätzliche eingeschränkte Eigenschaft im Eins-zu-Eins-Tag, die den Hibernate mitteilt, dass es in der aktuellen Klasse eine fremde Schlüsselbeschränkung gibt, dh die ID der aktuellen Klasse wird basierend auf der ID des Touser generiert.
Lassen Sie uns die Testklasse direkt hochladen. Dieses Mal verwendete die Testklasse keine JUNIT, sondern kam direkt mit der Hauptmethode:
public static void main (string [] args) {configuration cfg = new configuration (). configure (); SessionFactory SessionFactory = cfg.buildSessionFactory (); Session Session = SessionFactory.openSession (); Sitzung.BeginTransaction (); Tuser user = new tuser (); user.Setage (20); user.setName ("shuntest"); Tpassport passport = new tpassport (); passport.setExpiry (20); passport.setserial ("123123123"); passport.setUser (Benutzer); user.setPassport (Pass); Session.save (Benutzer); Session.Gettransaction (). commesent (); }Der Code ist sehr einfach, also werde ich nicht darüber sprechen. Schauen wir es uns hauptsächlich hier an:
Session.save (Benutzer);
Warum nennen wir hier nur einen Speichern? Der Grund dafür ist, dass die Cascade -Eigenschaft in unserer Tuser -Mapping -Datei auf alle gesetzt ist, was bedeutet, dass Tassport beim Speichern, Aktualisieren, Löschen usw. auch entsprechende Vorgänge ausführt, sodass wir keine Sitzung schreiben müssen. Wir sehen den Hintergrund:
Hibernate: In user4 (Name, Alter) Werte (?,?) Hibernate einfügen: In Passport4 (serielle, Ablauf, ID) -Werte (?,?,?)Hibernate: Es druckt zwei Aussagen aus und beweist, dass Hibernate diese Arbeit für uns erledigt hat.
public static void main (string [] args) {configuration cfg = new configuration (). configure (); SessionFactory SessionFactory = cfg.buildSessionFactory (); Session Session = SessionFactory.openSession (); Tuser user = (tuser) session.load (tuser.class, New Integer (3)); System.out.println (user.getName ()+":"+user.getPassPort (). GetSerial ()); } Hier fragen wir die Tuser -Klasse und erhalten das Tassport -Objekt. Ausländische Schlüsselvereinigung
Werfen wir nun einen Blick auf Einzelverbände, die Assoziationen durch ausländische Schlüssel herstellen.
Es ist immer noch das gleiche wie das Beispiel: Wir haben zwei Entitätsklassen geschrieben, Tgroup und Tuser
öffentliche Klasse Tgroup implementiert serialisierbare {private statische endgültige long serialversionuid = 1l; private int id; privater Zeichenfolge Name; privater Touser -Benutzer; // GET/SET -Methode weglassen} öffentliche Klasse Tuser implementiert serialisierbar {private statische endgültige lange Serialversionuid = 1L; private int id; privates int Alter; privater Zeichenfolge Name; Private Tgroup Group; // Get/Set -Methode auslassen} Schauen wir uns nach Abschluss der Entitätsklasse die Zuordnungsdatei an:
<hibernate-mapping package column = "Alter"/> <Viele zu einem Namen = "Gruppe" column = "Group_id" eindeutig = "true"/> </class> </hibernate-Mapping>
Hier sehen wir, dass das viele-zu-Eins-Tag anstelle von eins zu eins verwendet wird. Warum?
Ich habe ihm nicht viel Aufmerksamkeit geschenkt, als ich es zuvor benutzt habe. Wie auch immer, ich könnte es benutzen. Nachdem ich diesmal Xia Xins Buch gelesen hatte, habe ich endlich verstanden, dass diese Art der Assoziation durch ausländische Schlüssel nur eine besondere Art von vielen zu einem ist. Wir haben es durch Unique = "wahr" eingeschränkt, dass es nur einen haben muss, dh Eins-zu-eins-Assoziation.
Schauen wir uns als nächstes die Zuordnungsdatei von Tgroup an:
<hibernate-mapping package = "org.hiberNate.tutorial </Hibernate-Mapping>
Beachten Sie hier, dass wir wieder eins zu eins verwenden, was darauf hinweist, dass die aktuelle Entität und der Touser eins zu eins sind. Hier verwenden wir nicht viele zu eins, sondern geben an, welches Attribut in der Tuser-Entität die aktuelle Klasse-Tgroup assoziiert. Hier geben wir an, dass Tuser durch Gruppenattribute mit Tuser verbunden ist. Property-Ref gibt an, welche Eigenschaft zu assoziieren ist.
Schauen wir uns die folgende Testklasse an:
public class hibernatetest {public static void main (string [] args) {configuration cfg = new configuration (). configure (); SessionFactory SessionFactory = cfg.buildSessionFactory (); Session Session = SessionFactory.openSession (); Sitzung.BeginTransaction (); Tgroup Group = new Tgroup (); Group.SetName ("TestGroup"); Tuser user = new tuser (); user.Setage (23); user.setName ("test"); user.setGroup (Gruppe); Group.SetUser (Benutzer); Sitzung.Save (Gruppe); Session.save (Benutzer); Session.Gettransaction (). commesent (); Sitzung.CLOSE (); }} Beachten Sie, dass unser Code diesmal zweimal gespeichert werden muss, da sie entsprechende Korrespondenzen für einander enthalten. Das Speichern nur eines führt zum anderen zu einem Betrieb. Deshalb müssen wir den gespeicherten Betrieb zweimal anrufen. Schließlich eine Einreichung machen.
Hibernate druckt die Erklärung aus:
Hibernate: In Gruppe5 (Name) Werte einfügen (?) Hibernate: In user5 (Name, Alter, Group_id) Werte (?,?,?) Einfügen)
Dies bedeutet, dass wir zwei Objektwerte korrekt gespeichert haben.
Wir schreiben eine zusätzliche Testklasse zur Abfrage:
public static void main (string [] args) {configuration cfg = new configuration (). configure (); SessionFactory SessionFactory = cfg.buildSessionFactory (); Session Session = SessionFactory.openSession (); Tuser user = (tuser) session.load (tuser.class, New Integer (1)); System.out.println ("von Benutzer GET Group:"+user.getGroup (). GetName ()); Tgroup Group = (Tgroup) Sitzung.load (Tgroup.Class, New Integer (1)); System.out.println ("From Group Get Benutzer:" + Group.getUser (). GetName ()); Sitzung.CLOSE (); } Wir können beide das richtige Ergebnis erzielen, das zeigt, dass wir die Werte des anderen über zwei Objekte herausnehmen und unser Ziel erreichen können.
Die in diesem Beispiel verwendeten Tgroup und Tuser sind nur Beispiele. Tatsächlich entsprechen Benutzer im wirklichen Leben im Allgemeinen mehreren Gruppen.