Hibernate hat eine Klassifizierung und Integration durchgeführt und festgestellt, dass Hibernate tatsächlich in drei Teile unterteilt ist: Kernobjekt, Mapping und HQL. Diese drei Teile werden am häufigsten im Entwicklungsprozess verwendet. In den vorherigen Artikeln diskutiert die Konvertierungsmethoden zwischen Kernobjekten und Objekten. Besprechen Sie als Nächstes die Kartendutzungsmethoden von Winterschlaf.
Eine wichtige Funktion von Hibernate ist die Zuordnung, die zwischen Objektmodell und relationalem Modell umwandeln kann. Es wird durch objektorientierte Programmierideen befürwortet. Entwickler, die Mapping -Programme verwenden, müssen sich nur um das Schreiben von Code im Objektmodell kümmern. Die Zuordnung zwischen einem Objekt und einer relationalen Datenbank wird normalerweise durch ein XML -Dokument definiert. Dieses Mapping -Dokument ist so lesbar und kann manuell geändert werden. Ich fasse diese Zuordnungsbeziehung zusammen, wie in der folgenden Abbildung gezeigt:
Die Zuordnung wird über XML definiert, mithilfe der von Hibernate erstellten Sitzung verwaltet, und schließlich verwendet die Sitzung JTA, um die Änderungen an der Datenbank zu übermitteln. Die Sitzung kann als Persistenzmanager verstanden werden, der Objekte in der Persistenzschicht verwaltet. Es wird vom SessionFactory erstellt. Bei der Programmierung mit Hibernate müssen Sie zunächst eine Verbindung zur Datenbank herstellen. Sie müssen daher zunächst die Konfiguration der Datenbankverbindung in der XML überprüfen, ein SessionFactory entsprechend der Konfiguration des Dokuments (das als Datenbankspiegel verstanden werden kann) erstellen und dann eine SessionFactory erstellen. Schließlich wird in der Sitzung die Änderungen an der Datenbank einheitlich eingereicht, wodurch alle Vorgänge abgeschlossen werden.
Nutzungsprozess
1. Erstellen Sie eine Zuordnungsdatei, und die Zuordnungsdatei ist mit .hbm.xml satt, was darauf hinweist, dass es sich um eine Hibernate -Mapping -Datei handelt.
2. Registrieren Sie die Entitätsklasse in der Zuordnungsdatei und fügen Sie die Eigenschaften der Entitätsklasse zur Zuordnungsklasse hinzu. Beim Hinzufügen von Eigenschaften müssen Sie zwei Werte angeben: ID und Eigenschaft. Die ID zeigt an, dass es sich um die einzige Kennung einer Entität handelt, und die Eigenschaft zeigt an, dass es sich um eine Feldspalte der Tabelle handelt.
3. Senden Sie Änderungen und synchronisieren Sie Daten.
Hinweis: Entwickler, die XML -Daten in der Datenbank entwickelt haben, werden bald verstehen, dass diese Zuordnung tatsächlich ein Prozess der Batch -Update und der Stapelerstellung ist, und die Zuordnung ist keine Ausnahme. Der Winterschlaf vorsieht eine Reihe von Mapping -Standards, die gemäß den Standards konvertiert werden können. Die interne Implementierung ist immer noch tot, daher ist sie nur relativ flexibel und einfach zu bedienen.
Ein einfacher Entitätsklassenzuordnungsprozess:
1. Eigenschaftscode der Entitätsklasse User1:
Paket com.hibernate; import Java.util.date; public class user1 {private string id; privater Zeichenfolge Name; privates Zeichenfolgenkennwort; privates Date Createtime; privates Datum Ablauf; public String getid () {return id; } public String getName () {return name; } public void setName (String -Name) {this.name = name; } public String getPassword () {Kennwort zurückgeben; } public void setPassword (String -Passwort) {this.password = password; } public date getCreateTime () {return CreateTime; } public void setCreateTime (Datum CreateTime) {this.createTime = CreateTime; } öffentliches Datum getexpiretime () {return abiretime; } public void setExpiretime (Datumendezeit) {this.expiretime = Expiretime; }}
2. Die interne Code -Implementierung von user1.hbm.xml der Mapping -Datei user1.java:
Die Einstellungen, die in der grundlegenden Datenbank festgelegt werden können, sind auch in Hibernate bereitgestellt. Sie können Labelattribute verwenden, um bestimmte Zuordnungsbeziehungen festzulegen.
Klasse-> Tabellen verwenden Klassen-Tags, häufig verwendete Eigenschaften:
(1) Name: Kartenentitätsklasse, ihr Wert muss auf den Namen der Entitätsklasse eingestellt werden, die in eine Tabelle konvertiert werden muss. Während der Synchronisation wird die entsprechende Entitätsklasse basierend auf diesem Attribut gefunden.
(2) Tabelle: Kartieren Sie den Namen der Datenbanktabelle. Wenn sich der Name der zugeordneten Tabelle vom Namen der Entitätsklasse unterscheidet, verwenden Sie diese Eigenschaft, um die zugeordnete Tabelle anzugeben. Wenn es nicht vorhanden ist, wird eine Tabelle basierend auf dem Wert der Eigenschaft erstellt.
Überprüfen Sie die durch die Konfiguration generierte Tabellenstruktur in der obigen Abbildung, wie unten gezeigt:
Der Tabellenname wird in t_user1 geändert; Das Feld ID wird in user_id geändert und die Feldlänge beträgt 32 Bit. Die Eigenschaft CreateTime wird dem Datenbankfeld create_time zugeordnet und bis zum Datumstyp geändert.
Eigenschaft -> Felder verwenden ID oder Eigenschafts -Tags, häufig verwendete Eigenschaften:
(1) Name: Die Funktion ähnelt dem Namen des Klassen -Tags, und der Wert bestimmt den Mapping -Attributnamen der Entitätsklasse.
(2) Spalte: Ähnlich wie bei der Tabelle des Entitätsklassen -Tags den Spaltennamen der Zuordnungstabelle angeben und erstellt werden, wenn es nicht existiert.
(3) Typ: Geben Sie den Datentyp an, der auf Felder in der Datenbank zugeordnet ist, und sehen Sie sich das Dokument nach Bedarf an.
(4) Der optionale Generator wird verwendet, um eine eindeutige Kennung für eine anhaltende Klasse zu erzeugen.
<id name = "id" type = "long" column = "cat_id"> <generator> <param name = "table"> uid_table </param> <param name = "conal"> next_hi_value_column </param> </generator> </id>
Alle Generatoren implementieren die org.hibernate.id.identifiergenerator -Schnittstelle. Dies ist eine sehr einfache Schnittstelle; Einige Anwendungen können ihre eigene spezifische Implementierung bereitstellen. Hibernate bietet natürlich viele integrierte Implementierungen. Hier sind einige häufig verwendete Typen:
(1) Identität: Die zurückgegebene Kennung ist vom Typ lang, kurz oder int. Ähnlich wie das Feld Selbststillstand der Datenbank.
(2) Sequenz: Verwenden Sie Sequenzen in DB2, Postgresql, Oracle, SAP DB, MCKOI und Generatoren in Interbase. Die zurückgegebene Kennung ist vom Typ lang, kurz oder int. In der gesamten Datenbank müssen Sie anstatt sich selbst in einer einzelnen Tabelle selbst zu steigern, dass die Selbstverhinderung in einer einzelnen Tabelle hinzugefügt werden muss.
(3) UUID: Verwenden Sie einen 128-Bit-UUID-Algorithmus, um einen String-Typ-Kennung zu generieren, der in einem Netzwerk eindeutig ist (mit einer IP-Adresse). Die UUID wird als Zeichenfolge von 32-Bit-Hexadezimalzahlen kodiert. Ähnlich der von .NET generierten Seriennummer.
(4) Native: Wählen Sie eine Identität, Sequenz oder HILO basierend auf den Funktionen der zugrunde liegenden Datenbank. In flexibler Weise wird der verwendete Identitätstyp basierend auf der verwendeten Datenbank ermittelt. MySQL wählt Identität aus und Oracle wählt Sequenz aus.
(5) Zugewiesen: Erstellen Sie manuell eine Identifikations -ID für die Entitätsklasse. Dies ist die Standardgenerierungsrichtlinie, wenn das Element <Gergenators> nicht angegeben ist.
(6) Fremd: Verwenden Sie eine andere zugehörige Objektkennung. Normalerweise in Kombination mit <Eins-zu-Eins> verwendet.
Entwickler werden häufig an der manuellen Konfigurationsmethode verwendet, um Konfigurationseigenschaften gemäß den Dokumentationsanweisungen zu schreiben. Dies ist sehr primitiv. Anfänger empfehlen, die manuelle Konfigurationsmethode zu verwenden, um das Denken zu helfen. Es gibt auch viele Tools von Drittanbietern, die visuelle Methoden verwenden, um XML-Konfigurationsdokumente zu konfigurieren und zu generieren, was die Entwicklungseffizienz verbessert. Ähnliche Werkzeuge wie Xdoclet, Middlegen und Andormda.
Assoziative Mappings sind viele zu eins
Die grundlegende Zuordnung von Hibernate wird oben diskutiert. Eine Entitätsklasse entspricht einer Tabelle und verwendet die <class> Tag -Mapping in der entsprechenden Hibernate -Mapping -Datei. Und die normalen Eigenschaften in der Entitätsklasse entsprechen dem Tabellenfeld und werden unter Verwendung des <Spertations -Tags zugeordnet. Bei der Erstellung von Entitätsklassen sollten Sie darauf achten, dass der Standardkonstruktor ohne Parameter in Entitätsklassen implementiert und ein Etikett bereitgestellt werden sollte. Es wird empfohlen, die Entitätsklasse nicht endgültig zu ändern und Getter- und Setter -Methoden für die Entitätsklasse zu generieren. Schließlich werden mehrere Strategien zur Hauptschlüsselerzeugung eingeführt, und der nächste Schritt besteht darin, viele zu einer Zuordnung zu diskutieren.
Diese viel-zu-Eins-Korrelationszuordnung spiegelt sich im Objektmodell wider. Es ist eine Aggregationsbeziehung. Der Benutzer ist Teil der Gruppe. Es gibt Benutzer in der Gruppe. Ihre Lebenszyklen sind unterschiedlich und können sich in der folgenden Abbildung widerspiegeln:
Wie ist diese viele zu eins-zu-Eins-Beziehungen im Winterschlaf? Im Folgenden werden zwei Methoden eingeführt: Verwenden Sie das <viele zu eins> Tag, um direkt zu kartieren, oder verwenden Sie die Kaskade <viele zu eins>, um die Tabelle zu ändern.
1. Viele zu eins direkte Mapping <BR /> Es kann aus der wörtlichen Bedeutung verstanden werden, was bedeutet, dass es sich auf eine viele zu eins-zu-Eins-Beziehung bezieht. Viele beziehen sich auf das bessere Ende, und man bezieht sich auf das weniger Ende. Bei der Verwendung wird das Tag häufig im HBM des mehr Endes verwendet, und das Namensattribut von <viele zu ein> wird auf das Attribut eines Endes eines Endes in der entsprechenden Klasse der Zuordnungsdatei festgelegt, wie z. Dieses Tag wird user.hbm.xml hinzugefügt, was vielen entspricht; Der Name Value im Tag ist eine Gruppe, um eins zuzuordnen, und es gibt ein Attribut namens Group in user.java. Schauen wir uns als nächstes die spezifische Codeklasse an, die die Implementierung implementiert.
(1) User.java-Klassencode mit einer Eigenschaft namens Group, die als Namenswert des einen Ende von <viele zu eins> verwendet wird.
public class user {private Zeichenfolge Name; public String getName () {return name; } public void setName (String -Name) {this.name = name; } Private Group Group; Public Group GetGroup () {Return Group; } public void setGroup (Gruppengruppe) {this.group = Group; }}(2) Der Wert des Namens von <viele zu eins> in user.hbm.xml ist der Eigenschaftswert der Ein-Seite in user.java. Es wird eine neue Spalte in der Datenbank generiert, die als Fremdschlüssel der Benutzertabelle verstanden werden kann.
<? 3.4.0.cr1-> <hibernate-mapping> <class name = "com.hiNNate.user" table = "user"> <id name = "id" type = "java.lang.long"> <Spaltenname = "id" /> <generator /> < /id> <! Es wird automatisch eine Spalte in der Tabelle generiert, sodass die Spalte mit der Spalte umbenannt wird-> <viele zu einem namens "gruppe" column = "gruppenID"> </viele zu-eins> </class> </hibernate-mapping>
(3) Testen Sie die obige Zuordnungsbeziehung, schreiben Sie zwei Benutzerobjekte in die Tabelle, nennen Sie IT User1 und User2, nennen Sie es Zhang San und Li Si, verwenden Sie die Sitzung, um das Objekt zu speichern, Daten in die Datenbank zu schreiben. Der Code lautet wie folgt:
public void testsave1 () {session session = null; try {session = getSession.getSession (); Sitzung.BeginTransaction (); Gruppe Group = New Group (); Group.SetName ("Power Node"); User user1 = new user (); user1.setName ("Zhang san"); user1.setGroup (Gruppe); User user2 = new user (); user2.setName ("li si"); user2.setGroup (Gruppe); Session.save (user1); Session.save (user2); // Der transsientObjectException -Fehler wird gemeldet // Der Fehler tritt bei der Reinigung des Cache TransientObjectException auf // Da die Gruppe vorübergehend Zustand ist, ist er nicht geschrieben, und es gibt keine übereinstimmenden Daten in der Datenbank // Wenn der Benutzer anhaltend ist. Session.Gettransaction (). commesent (); } catch (Ausnahme e) {e.printstacktrace (); Session.Gettransaction (). Rollback (); } endlich {getSession.closeSession (Sitzung); }}Bei der Verwendung des obigen Code wird jedoch bei der Ausführung von Schreibvorgängen ein TransientObjectException gemeldet. Dies liegt daran, dass beim Speichern des Benutzerobjekts nach der Gruppe, die in <viele zu eins> hinzugefügt wurde, nach Gruppenobjekten im Speicher gesucht wird. Im obigen Code befand sich das Gruppenobjekt jedoch immer im vorübergehenden Zustand und wird von der Sitzung nicht verwaltet, was bedeutet, dass das Sitzungsobjekt nicht gefunden werden kann und das Benutzerobjekt in den persistierenden Zustand eingeht, sodass dieser Fehler gemeldet wird. Der richtige Code ist wie folgt:
public void testsave2 () {session session = null; try {session = getSession.getSession (); Sitzung.BeginTransaction (); Gruppe Group = New Group (); Group.SetName ("Power Node"); Sitzung.Save (Gruppe); // Setzen Sie das Gruppenobjekt hier auf den persistenten Objekt user user1 = new user (); user1.setName ("Zhang san"); user1.setGroup (Gruppe); User user2 = new user (); user2.setName ("li si"); user2.setGroup (Gruppe); Session.save (user1); Session.save (user2); // Die Daten können korrekt gespeichert werden //, da Gruppen und Benutzer Objekte im persistenten Zustand sind // Das zugehörige Objekt kann in der Sitzung gefunden werden, wenn Hibernate die Cache -Session.Gettransaction (). Commit () reinigt; } catch (Ausnahme e) {e.printstacktrace (); Session.Gettransaction (). Rollback (); } endlich {getSession.closeSession (Sitzung); }} 2. Caskading Mapping
Zusätzlich zum Konvertieren sowohl das Gruppenobjekt als auch das Benutzerobjekt in das oben erwähnte persistente Objekt können Sie auch die Cascade Cascade Mapping-Attribute verwenden, das Cascade-Attribut in das Attribut <viele zu-eins> hinzufügen und kopieren, um das Updat zu speichern. Sie können in die Datenbank schreiben, wenn sich das Gruppenobjekt nicht im anhaltenden Zustand befindet. Auf diese Weise müssen Sie nur die Gruppenattribute der beiden Benutzerobjekte auf demselben Gruppenobjekt festlegen, um eine viel-zu-Eins-Zuordnungsbeziehung zu erreichen. Zu diesem Zeitpunkt ist der entsprechende Inhalt in user.hbm.xml der folgende Code:
<? 3.4.0.cr1-> <hibernate-Mapping> <class name = "com.hiberNate.user" table = "user"> <id name = "id" type = "java.lang.long"> <Spaltenname = "id" /> <generator /> < /> < /id> <! Cascade = "Save-update"> </viele zu eins> </class> </hibernate-Mapping>
HINWEIS: Nachdem Cascade auf Save-Update eingestellt ist, kann es kaskadierte Änderungen, Addition und Löschung in die Datenbank sein, aber der spezifische Cascade-Abfragevorgang kann nicht durchgeführt werden.
Die entsprechende Testkonfigurationsdateimethode lautet wie folgt:
// Cascade Cascade public void testsave3 () {Session Session = null; try {session = getSession.getSession (); Sitzung.BeginTransaction (); Gruppe Group = New Group (); Group.SetName ("Power Node"); User user1 = new user (); user1.setName ("Zhang san"); user1.setGroup (Gruppe); User user2 = new user (); user2.setName ("li si"); user2.setGroup (Gruppe); Session.save (user1); Session.save (user2); // Die TransientObjectException wurde nicht geworfen //, da Cascade verwendet wird // Hibernate wird zuerst die zugehörige Objektgruppe des Benutzers speichern // Gruppe und Benutzer sind beide Objekte in der persistenten Status -Sitzung. } catch (Ausnahme e) {e.printstacktrace (); Session.Gettransaction (). Rollback (); } endlich {getSession.closeSession (Sitzung); }} 3. Vergleichende Sublimation
Die beiden Methoden implementieren auch eine viel- und eins-Zuordnungsmethode, und die Ergebnisse sind gleich, sind jedoch in der Implementierung sehr unterschiedlich. Unabhängig davon, ob der erste oder der zweite Typ <viele zu eins> verwendet, um das Tag zu der Zuordnungsdatei an vielen Ende hinzuzufügen, und das Namensattribut des Tags dem Attributwert des einen Ende der von der Zuordnungsdatei registrierten Klasse zuweisen und so die vielen-zu-Eins-grundlegenden Zuordnungen abschließen, die gleich sind. Der Unterschied besteht darin, dass die direkte Zuordnungsbeziehung die Attribute des Hibernate -Feldes nicht verwendet, was in der Implementierung flexibler ist. Es unterstützt nicht nur Addition, Löschung und Änderung, sondern ermöglicht auch die Abfrage. Die zweite Änderung der Kaskaden -Kaskaden -Modifikation nimmt die von Hibernate bereitgestellte Methode an. Diese Methode unterstützt nur Addition, Löschung und Änderung und unterstützt keine Abfragen.