1. Der Lebenszyklus des anhaltenden Objekts
Nachdem die Anwendung das Hibernate -Framework verwendet hat, werden die von der Anwendung erstellten anhaltenden Objekte einen vollständigen Satz von Lebenszyklen durchlaufen, um die Datenbankvorgänge abzuschließen, darunter die drei Hauptzustände vorübergehend, Persistenz und abgelöst. Die Übergänge dieser drei Zustände können in der Anwendung gesteuert werden, wie in der folgenden Abbildung gezeigt:
Um diese Zustände klar zu verstehen, ist hier ein Beispiel, um die Unterschiede zwischen Objekten in diesen Zuständen anzuzeigen. Die folgenden Codes in den Zuständen sind wie folgt:
(1) Erstellen Sie eine Hibernate_Session -Assembly und fügen Sie ein entsprechendes JAR -Paket hinzu.
(2) Hibernate konfigurieren, die entsprechende Entitätsbenutzerklasse und ihre Zuordnungsdateien hinzufügen und die entsprechende Datenbankverbindung konfigurieren.
Benutzerklassendatei -Mapping -Datei user.hbm.xml Code:
<? 3.4.0.cr1-> <hibernate-mapping> <class name = "com.hiNNate.user"> <id name = "id"> <generator/> </id> <Eigenschaft name = "name"/> <Eigenschaft name = "password"/> <Eigenschaft name = "createtime"/> <Eigentumsname ".
Konfigurationscode für Hibernate -Datenbankverbindungskonfiguration:
<xml Version = "1.0" coding = "utf-8"?> <! docType hibernate-configuration public "-// hibernate/hibernate configuration dtd 3.0 // en" "http://hibernate.sourceforge <session-factory> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_session</property> <property name="hibernate.connection.username">root</property> <Eigenschaft name = "hibernate.connection.password"> AB12 </property> <!-Dialekt: Dialekt, die eingekapselte zugrunde liegende API, ähnelt die Datenbank in die entsprechende Sprache in der Konfiguration-> <Eigenschaft name = "hibernate.dialect"> org.hibernate ressourcen = "com/hibernate/user.hbm.xml"/> </session-factory> </hibernate-configuration>
(3) eine öffentliche Klasse der statischen Mitglieder -Sitzungen hinzufügen, um ein SessionFactory und sein Sitzungsobjekt zu erstellen.
Paket com.hibernate; import org.hibernate.session; import org.hiberNate.sessionFactory; import org.hibernate.cfg.configuration; öffentliche Unterrichtssitzung {private statische SessionFactory Factory; // statische statische lokale variable SessionFactory, Datenbank Mirror static {try {// Erstellen und abrufen die Konfigurationsdatei für die Konfigurationsdatenbank und erhalten Sie Hibernate.cfg.xml -Konfiguration cfg = new configuration (). Configure (); factory = cfg.buildsessionFactory (); // Erstellen Sie ein Datenbankbild} catch (Ausnahme e) {e.printstacktrace (); // Fehlermeldung drucken}} öffentliche statische Sitzung getSession () {return factory.OpenSession (); // Rückgabe des erstellten Sitzungsobjekts} public static SessionFactory getSessionFactory () {return factory; // Geben Sie die entsprechende Sitzung zurück. }}}}}(4) Fügen Sie einen Quellordner hinzu und fügen Sie ein Paket namens Com.hiberNate in den Ordner hinzu und fügen Sie dem Paket eine Klassendatei mit dem Namen SessionTest hinzu.
Paket com.hibernate; import Java.util.date; Import JUNIT.Framework.TestCase; import org.hibernate.session; import org.hibernate.transaction; öffentlicher Unterrichtstest erweitert TestCase {} 2. Zustandsumwandlungsmethode
1. Das Objekt tritt direkt in den anhaltenden Zustand ein
1.1 Methode abrufen
Holen Sie sich eine Reihe von Informationen aus der Datenbank und synchronisieren Sie die Informationen in das erstellte Objekt. Diese Methode gibt ein Objektobjekt zurück und null, wenn kein Inhalt gefunden wird. Das folgende Beispiel verwendet die Sitzungsmethode, um ein Objekt zu erhalten und das Objekt in eine Instanz umzuwandeln.
public void testget1 () {session session = null; Transaktion TX = NULL; try {session = hibernateUtils.getSession (); // Transaktion tx = Session.beGinTransaction (); // Das von GET geladene Objekt ist ein anhaltendes Objekt // Ausführen von Get to to to Sofort eine Abfrageanweisung aus. System.out.println (user.getName ()); // Persistierender Zustand // Objekt mit anhaltender Status ändert sich, wenn sich die Eigenschaften des Objekts ändern // Hibernate synchronisieren Benutzer.setName ("Zhao liu"); Session.Gettransaction (). commesent (); } catch (Ausnahme e) {e.printstacktrace (); if (tx! = null) {tx.rollback (); }} endlich {hibernateUtils.closession (Sitzung); }} Stellen Sie den Bruchpunkten fest, um das Benutzerobjekt zu erhalten.
Dieses Objekt wird erhalten und ein Benutzerobjekt wird nach dem Gießen erhalten. Die SetName -Methode wird dem Programm hinzugefügt, was bedeutet, dass der Name in der Datenbank aktualisiert wird. Nach Abschluss der Ausführung wird die Datenbank überprüft, wie in der folgenden Abbildung gezeigt, um die Ergebnisse zu aktualisieren.
1.2 Lastmethode
Die Funktion ähnelt der GET -Methode und erhalten auch Daten aus der Datenbank und synchronisiert sie in das Objekt. Diese Methode unterstützt den faulen Betrieb. Es gibt ein anhaltendes Objekt oder einen Proxy zurück, so dass es umgewandelt werden muss.
public void testload1 () {session session = null; try {session = hibernateUtils.getSession (); // Die Anweisung Abfrage wird nicht sofort überprüft, da das Ladung faul unterstützt (Verzögerungsladung/faules Laden) // Was ist faul zu lehren? Erst wenn dieses Objekt wirklich verwendet und dann erstellt wird, wird die Abfrageerklärung für Winterschlafe ausgestellt. Es ist hauptsächlich, um die Leistung zu verbessern. Lazy ist eine sehr wichtige Funktion in Hibernate. Wie wird der Fauler von Hibernate implementiert? Implementiert von Proxy -Objekten. Die Proxy -Objekte verwenden hauptsächlich //, die von der CGGLIB -Bibliothek anstelle des dynamischen Proxy von JDK generiert werden, da der dynamische Proxy von JDK nur Proxy für Klassen generieren kann, die Ausreden implementieren. CGGLIB kann // Proxy für Klassen generieren. Es übernimmt die Erbschaftsmethode user = (Benutzer-) Sitzung.load (user.class, "8A1B653745BCC7B50145BCC7B7B7140001"); System.out.println (user.getName ()); // Persistierender Zustand // Objekte mit persistierenden Zustand, wenn sich die Eigenschaften des Objekts ändern // Hibernate synchronisieren user.setName ("Zhaoliu"); Session.Gettransaction (). commesent (); } catch (Ausnahme e) {e.printstacktrace (); } endlich {HibernateUtils.Closession (Sitzung); }} Abfragen Sie, um das Benutzerobjekt wie in der folgenden Abbildung gezeigt zu erhalten:
Durch die Analyse der obigen Abbildung ist das erhaltene Benutzerobjekt nicht vollständig oder es gibt kein gemeinsames Benutzerobjekt, aber es ist ein Proxy. Es verwendet CGLIB, um das Objekt vorzuladen, und wird bei Verwendung des Objekts nur wirklich erstellt.
1.3 Get vs Last
Get and Load -Methoden sind sehr wichtig. Sie werden oft in Interviews mit Hibernate aufgenommen. Das Folgende ist ein Vergleich der folgenden zwei.
Ähnlichkeiten:
(1) Die Funktionen sind gleich und die Beziehungsdaten werden in Objekte konvertiert.
(2) Die Verwendungsmethode ist gleich, und es sind ebenfalls zwei Unterschiede in den Parametern erforderlich:
(1) Die Lastmethode unterstützt den faulen Betrieb, lädt das Objekt vor und wird nur bei Verwendung erstellt. Relationale Daten in Objekte direkt konvertieren.
(2) Wenn das Last -Lastobjekt nicht vorhanden ist, wird ein ObjectNotFoundException geworfen, und wenn das GET die Daten nicht erhält, wird NULL zurückgegeben.
2. manuell konstruieren abgelöste Objekte
Es gibt eine andere Methode, um ein Objekt zu erhalten. Es unterscheidet sich von den Get- und Lastmethoden. Es ist eine manuelle Methode. Zuerst ist ein Objekt häufig, und dann werden die Daten des Objekts durch Formulierung einer ID erhalten. Die Methode lautet wie folgt:
public void testuer () {session session = null; try {session = hibernateUtils.getSession (); Sitzung.BeginTransaction (); // manuell aufgenommene abgelöste Objektuser user = new user (); user.setID ("8A1B653745BCC7B50145BCC7B7B7140001"); // Persistierender Zustand // Objekt mit persistierenden Status, wenn sich die Eigenschaften des Objekts ändern // Hibernate synchronisieren Session.getTransaction (). COMMET () mit der Datenbank beim Reinigen des Cache (schmutzige Datenprüfung); } catch (Ausnahme e) {e.printstacktrace (); } endlich {HibernateUtils.Closession (Sitzung); }} Zeigen Sie das erhaltene Ergebnisdiagramm an:
Das Analyseergebnisdiagramm wird im Code verwendet, um die ID -Nummer für das Objekt festzulegen. Nach der Formulierung der ID -Nummer kann das Objekt betrieben werden. Nach der Übermittlung der Transaktion wird sie in die Datenbank synchronisiert, und manuell wird manuelle Spezifikation zum manuellen Angeben der Objektinformationen verwendet.
2.1 Methode löschen
Um das in der Datenbank angegebene Objekt zu löschen, muss das Objekt vor dem Löschen in den anhaltenden Zustand konvertiert werden. Sie können GET-, Lade- oder Handwerkmethoden verwenden, um das Objekt anzugeben. Die Methode lautet wie folgt:
Session = hibernateUtils.getSession (); Sitzung.BeginTransaction (); User user = (user) session.load (user.class, "8A1B653745BCC6D50145BCC6D67A0001"); // Es wird empfohlen, diese Methode zu löschen, zuerst zu laden und dann die Sitzung zu löschen. Delete (Benutzer).
2.2 Update
Aktualisieren Sie die Daten, diese Methode ändert die Daten in der Datenbank. Bei der Verwendung befindet sich eine Situation in der Menge, die den Wert eines bestimmten Feldes in der Datenbank aktualisiert oder die gesamte Zeile der Datenbank aktualisiert.
2.2.1 Aktualisieren Sie einen Feldwert
Wenn Sie vor dem Aktualisieren nur den Wert eines bestimmten Feldes aktualisieren möchten, müssen Sie das Objekt wie folgt in einen anhaltenden Statuscode umwandeln:
// Sitzungsobjekt Sitzung = hibernateUtils.getSession (); // Transaktionssitzung öffnen.BeginTransaction (); // oder Sie können eine andere Methode verwenden, um //sesion.getTransaction () zu aktivieren (). Begin (); // Laden Sie das Benutzerobjekt // Methode 1: Verwenden Sie die Lastmethode // user = (user) session // Methode 2: Manuell user user = new user () erhalten; user.setID ("8A1B653745BCC7B50145BCC7B7B7140001"); // den Namen user.setName ("Zhangsan" aktualisieren); Session.Update (Benutzer); Session.Gettransaction (). commesent ();2.2.2 Aktualisieren Sie die gesamte Zeile <BR /> Wenn Sie die Daten der gesamten Zeile aktualisieren möchten, können Sie den Status manuell in den abgetrennten Zustand konvertieren und den ID -Wert des Objekts manuell angeben. Der Code ist wie folgt:
// Sitzungsobjekt Sitzung = hibernateUtils.getSession (); // Transaktionssitzung öffnen.BeginTransaction (); // oder kann eine andere Methode verwenden, um //sesion.getTransaction () zu aktivieren (). Begin (); // manuell user user = new user () erhalten; user.setID ("8A1B653745BCC7B50145BCC7B7B7140001"); // den Namen user.setName ("Zhangsan" aktualisieren); Session.Update (Benutzer); Session.Gettransaction (). commesent (); Aktualisierungsergebnisse anzeigen:
Analyse der Aktualisierungsergebnisse aktualisiert tatsächlich die gesamte Datenzeile der Datenbank. Es gibt zu viele Unsicherheiten in dieser Aktualisierungsoperation und wird nicht empfohlen, diese zu verwenden.
2.3 Methode speichern
Daten einfügen. Bei der Ausführung der Speichernmethode wird die Datenbankeinfügungsanweisung aufgerufen, um der Datenbank eine neue Zeile hinzuzufügen. Das gespeicherte Objekt wird in einen anhaltenden Zustand umgewandelt. In diesem Zustand kann das Objekt das Objekt erneut aktualisieren und wird mit Änderungen in der Datenbank aktualisiert, wenn die Transaktion schließlich übermittelt wird. wie folgt:
public void testsave2 () {session session = null; Transaktion TX = NULL; try {session = hibernateUtils.getSession (); // Transaktion tx = Session.beGinTransaction (); // Transient Status user user = new user (); user.setName ("zhangsi"); user.setPassword ("123"); user.setCreateTime (neues Datum ()); user.setExpiretime (neues Datum ()); // Persistierender Zustand // Objekt mit anhaltender Status ändert sich, wenn sich die Eigenschaften des Objekts ändern // Hibernate synchronisieren Session.save (Benutzer). user.setName ("lisi"); tx.commit (); } catch (Ausnahme e) {e.printstacktrace (); if (tx! = null) {tx.rollback (); }} endlich {hibernateUtils.closession (Sitzung); } // Abstandstatus} Zeigen Sie die vorherige Beispiel -Läufe -Ergebnisansicht an:
Analyseergebnis: Die Sitzung führt bei der Übermittlung der Transaktion tatsächlich zwei Vorgänge. In Kombination mit dem Aktualisierungsprozess im Code wird zunächst ein neues Benutzerobjekt hinzugefügt, und dann wird ein Speichervorgang ausgeführt. Es wird die Anweisung einfügen, dann wird eine SetName-Operation im Code ausgeführt und der Name wird neu modifiziert. Es wurde jedoch derzeit nicht in die Datenbank synchronisiert, sondern befindet sich im Speicher. Zu diesem Zeitpunkt wird es zwei Staaten geben. Wir sagen, dass die Datenbits zu diesem Zeitpunkt schmutzige Daten sind und schließlich bei der Übermittlung der Transaktion auf die Datenbank aktualisieren.