Die in diesem Artikel erforderliche erste Datenbankdatei, vollständige Beispielcode für gemeinsame Hibernate -Operationen (einschließlich aller erforderlichen JAR -Dateien für Hibernate -Operationen) wird zum Download und Lernen bereitgestellt: http://download.csdn.net/detail/daijin88888/9551724
1. Hibernate Association Mapping
1) Was ist Association Mapping?
Wenn es einen Zusammenhang zwischen Tabellen gibt, ermöglicht es dem Durchgang, dass wir ihre Assoziation in HBm.xml beschreiben und dann nach dieser Beziehung automatisch in einer anderen Beziehungstabelle arbeiten, wenn wir einen der Tabellen betreiben. Anschließend werden die Einstellungen dieser Assoziationsbeziehung als Association Mapping bezeichnet.
2) Was sind die Vorteile der Assoziations -Kartierung?
Mit einem Besuch können mehrere Tabellen verknüpft werden
-Folgen Sie den Daten der Beziehungstabelle assoziativ
-Neue und modifizierte Daten von Beziehungstabellen assoziieren
-Associated Löschendaten aus der Beziehungstabelle
3) Schritte zur Verbindungsabbildung Implementierung
- Verstehen Sie die Beziehung zwischen Tabellen und klären Sie die Beziehungsfelder
-Wenden Sie das Assoziationsattribut in der Entitätsklasse an, um die zugehörigen Daten zu verkörpern
-Sie müssen die HBm.xml-Datei konfigurieren und die Assoziationsbeziehung festlegen
*2. Eins-zu-Viele-Assoziation
Beispiel: Wenn ein Konto über mehrere Dienstdatensätze verfügt, wird hoffen, dass bei der Abfrage der Kontodaten automatisch seine entsprechenden Dienstdaten abfragen.
1) Tabellenbeziehung
Eine Eins-zu-Viele-Beziehung, das Beziehungsfeld ist service.account_id. (Das heißt, es muss ein Feldkonto -ID in der Kontentabelle in der Diensttabelle zugeordnet sein, und dieses Feld entspricht der ID in der Kontentabelle)
2) Beziehungsattribute anhängen
Gehen Sie in der Kontoklasse die zugehörigen Attributdienste an, nämlich Typ Set <Service>.
private set <Service> dienste = new Hashset <Service> ();
3) Beziehungen aufbauen
--Grammatik
Legen Sie eine Eins-zu-Viele-Beziehung in Konto fest.hbm.xml
<set name = "Assoziationsattributname"> <Key Column = "Assoziationsfeldname"/> <Eins-zu-Many/> </set> --implement <set name = "dienste"> <key column = "account_id"/> <Eins-zu-Many/> </set>
4) Beispielcode
Bekannt:
-Assoziierte Attributdienste
-Associated Field Account_ID
-Association-Objektdienst-> Tabellenname Service
<span style = "font-size: 14px;"> public void testfind () {session session = hibernateUtil.getSession (); Konto a = (Konto) Sitzung.load (Konto.Class, 1010); System.out.println ("--- show Account-Kontoinformationen ----"); System.out.println (a.getId () + "" + A.getRealName () + "" + A.getIdcardno ()); System.out.println ("-das Geschäftskonto unter dem Girokonto ----"); Set <Service> dienste = a.getServices (); für (Service S: dienste) {System.out.println (S.GetID () + "" + S.GetOsusername () + " + S.GetunixHost ()); } System.out.println (a.toString ()); } </span>*3. Viele zu einem Verband
Beispiel: Ich hoffe, dass ich nach Abfragen von Dienstdaten die entsprechenden Kontodaten automatisch abfragen kann.
1) Beziehung
Service und Konto haben eine viel- und eins-Beziehung, und das Beziehungsfeld ist service.account_id
2) Gehen Sie die zugehörigen Attribute an
-Wenn Sie das zugehörige Immobilienkonto in der Dienstleistungsklasse für Dienstleistungen anrufen, ist sein Typ Konto.
privates Konto;
Danach kann das AccountID
3) Beziehungen aufbauen
A. Syntax:
-In service.hbm.xml, fügen Sie die Konfiguration der Assoziationsbeziehung hinzu
-<viele zu eins Name = "Assoziationsattributname"
column = "relationaler Feldname"
/>
B. Durchführung:
<viele zu eins name = "Konto"
column = "account_id"
/>
4) Beispielcode
Bekannt:
-Association Eigenschaftskonto
-Associated Field Account_ID
-Account-> Tabellenname-Konto, Primärschlüssel-ID
<span style = "font-size: 14px;"> public void testfind () {session session = hibernateUtil.getSession (); Service S = (Service) Sitzung.get (Service.Class, 2002); System.out.println ("---- Show-Geschäftskontoinformationen ----"); System.out.println (S.GetID () + "" + S.GetOSusername () + "" + S.GetunixHost ()); System.out.println ("--- Zeigen Sie verwandte Kontoinformationen ---"); System.out.println (S.GetAccount (). GetId () + "" + S.GetAccount (). GetRealName ()); } </span>*4. Verwandte Operationen
1) Verwandte Abfrage
Wenn Sie eine SQL -Anweisung verwenden müssen, um das aktuelle Objekt und das zugehörige Attribut zu instanziieren, können Sie die folgende Methode verwenden:
A. (Nicht empfohlen) Ändern Sie die zugehörige Attributzuordnung in HBm.xml
Fauler Attribut:
Richtig bedeutet, dass das faule Laden aktiviert ist;
Falsch bedeutet, faules Laden zu schließen
Abrufenattribut:
Join bedeutet, dass die Verbindungsmethode verwendet wird, um mit dem Hauptobjekt abzufragen. Zu diesem Zeitpunkt ist Lazy = "False" ungültig;
Wählen Sie (Standard) aus
B. (Empfohlen) Pass -HQL und schließen Sie sich mit der Fetch -Syntax an
-FROM ACOT A JUGE FETCH A. SERVICES WO A.ID =?
Bedeutung: Beim Abfragen des Kontokonto -Objekts werden die zugeordneten Dienste zugehörigen Attributdaten mithilfe der Tabellenverbindung zusammen gefunden.
-FROM Service s Join Fetch S. Account Wo s.id =?
Bedeutung: Beim Abfragen von Dienstobjekten wird das Konto -zugeordnete Attributdaten mithilfe der Tabellenverbindung zusammen gefunden.
-FROM Service s Join Fetch S. Account Wo S. Account.id =?
Beachten:
- Die Objekte und Eigenschaften sind in HQL geschrieben
-Join Abret hat nach ihr keine Klausel, und Abret ist zugeordnetes Attribut zugeordnet
-Query.SetInteger, um den Integer-Parameterwert festzulegen, und das Index startet von 0.
-Wenn es klar ist, dass die HQL nur einen Datensatz zurückgibt, können Sie die Methode query.uniqueresult () verwenden, um einen eindeutigen Datensatz zurückzugeben
C. Beispielcode (Schreiben Sie den oben genannten Ein-zu-Viele-Association-Abfragecode um)
<span style = "font-size: 14px;"> public void testfind () {session session = hibernateUtil.getSession (); // Konto a = (Konto) Sitzung.load (Konto.Class, 1010); String hql = "Aus Konto ein Join Fetch A.Services, wo A.id =?"; Query query = session.createquery (HQL); Query.SetInteger (0, 1010); //? Starten Sie ab 0 Konto a = (Konto) query.uniqueresult (); // Single-Line-Abfrage kann system.out.println ("--- Kontoinformationen anzeigen ----") verwenden; System.out.println (a.getId () + "" + A.getRealName () + "" + A.getIdcardno ()); System.out.println ("--- Zeigen Sie das Geschäftskonto unter dem Girokonto ----"); Set <Service> dienste = a.getServices (); für (Service S: dienste) {System.out.println (S.GetID () + "" + S.GetOsusername () + " + S.GetunixHost ()); } System.out.println (a.toString ()); } </span> 2) Kaskadierung von Addition und Kaskadierungsmodifikation
A. Wenn eine Tabelle eine Assoziationsbeziehung aufweist, bietet Hibernate nicht nur die Funktion der Assoziationsabfrage, sondern auch die Möglichkeit, in der Assoziationstabelle Daten hinzuzufügen, zu ändern und zu löschen. Diese Fähigkeit wird als Kaskadierungsoperation bezeichnet.
B. So implementieren Sie Kaskadiervorgänge
Sie müssen die Attributkaskade an dem Ort hinzufügen, an dem das zugeordnete Attribut festgelegt ist.
--None: Cascading wird standardmäßig nicht unterstützt
-SAVE-UPDATE: Unterstützt die Ergänzung und Aktualisierung der Kaskadierung und Aktualisierung
-Delete: Unterstützt die Kaskadierung der Löschung
--All: Unterstützt die Kaskadierung von Addition, Update und Löschen
C. Beschreibung
Normalerweise gibt es eine 1-zu-Viele-Tabellen-Beziehung. Eine Seite von 1 ist der Haupttisch und die andere Seite von 1 ist der Sklaventisch. Es ist häufig erforderlich, die Slave -Tabellendaten hinzuzufügen, zu aktualisieren und zu löschen, wenn die Haupttabelle addiert, aktualisiert und gelöscht wird. Zum Beispiel: Beim Löschen eines Kontos müssen Sie die Daten des Geschäftskontos gemeinsam löschen.
3) Kaskadendeletion
A. Setzen Sie Cascade = "Delete" oder Cascade = "Alle", um die Cascade -Löschung zu unterstützen
B. Im Allgemeinen ist es notwendig, das Attribut inverse = "true" am festgelegten Tag von 1 hinzuzufügen.
C. Session
D. Methoden zur Stapeldeletion:
Cascading Delete verwendet n+1 löschen Anweisungen, um die zugehörigen Daten der Haupttabelle und der Fremdschlüsseltabelle zu löschen.
Wenn es sich um eine Batch -Löschung handelt, wird die Kaskadierung von Löschungen nicht empfohlen. Es wird empfohlen, HQL zum Schreiben von Löschdeletenanweisungen zu verwenden .
Aus dem Dienst löschen wobei Account.id =? // Alle Daten des Kontos löschen.id =? In der Service -Tabelle (dieser Satz ersetzt n delete Anweisungen in der Kaskadierungsoperation)
Aus dem Konto löschen, wo id =?
4) Inverse Attribut (Verständnis) Details hier
Ob Sie die Kontrolle der Beziehungswartung übergeben möchten. Das heißt, die Beziehung zwischen den Konto- und Serviceobjekten wird von beiden Parteien verwaltet. Dies bedeutet, dass Sie bei der Durchführung von Kaskadierungsvorgängen auf Konto- oder Serviceobjekten eine Aktualisierungsanweisung ausführen müssen, um den zugehörigen Feld auf dieselbe ID festzulegen. Wenn Sie die Beziehungswartungsarbeiten einer bestimmten Partei stornieren müssen, können Sie dem Abschnitt "Zugehörige Attribute" Inverse = "True" hinzufügen, wodurch die Ausführung der Aktualisierungsanweisung vermieden werden kann.
Richtig: Hand über Kontrolle ist das aktuelle Objekt nicht für die Aufrechterhaltung der Beziehung zwischen den beiden Tabellen verantwortlich
Falsch: Die Kontrolle wird nicht übergeben. Das aktuelle Objekt muss für die Aufrechterhaltung der Beziehung zwischen den beiden Tabellen verantwortlich sein
TIPP: Es wird oft auf Inverse = "True" für eine Partei (d. H. Der <Eins-zu-Many> -Beaging-Teil) zu Inverse = "True" eingestellt, so dass eine große Anzahl von Aktualisierungs-Aktualisierungsanweisungen bei der Kaskadierung von Operationen auf einer Partei vermieden werden kann.
*5. Viele zu viele zu viele Assoziationen
Beispiel: admin admin_info und rollen rollen_info haben eine viel zu viele Beziehung. Ich hoffe, dass er beim Abfragen des Administrators seine entsprechende Rolle abfragen kann. Beim Entwerfen einer Datenbank müssen 3 Tabellen verwendet werden, um sie darzustellen.
Admin_info (admin)
Admin_role (Admin- und Rollenbeziehung)
Rolle (Rolle)
1) Beziehungsfelder
Die Beziehungsfelder befinden sich in ihrer Zwischentabelle admin_role.
admin_id = admin_info.id
rollen_id = rollen_info.id
2) Gehen Sie die zugehörigen Attribute an, die die rollenbezogenen Attribute an die Entitätsklasse des Administrators anhängen
Setzen Sie <rolle> Rollen
3) Gehen Sie die Association Mapping -Konfiguration in admin.hbm.xml an
-Syntax <set name = "Assoziationsattributname" table = "Middle Table Name"> <Key Column = "Administrator-Feldname"/> <Viele zu viel-zu-Many-Spalten = "Administrator"/> </set> -Code <set name = "roles" table = "admin_role"> <key column = "admin_id"/> <viele to-manns-spalte
4) Kaskadenbetrieb
Kaskade bedeutet, dass Kaskadenoperationen unterstützt werden und die Tabelle auf der anderen Seite funktioniert, anstatt die Zwischentabelle der Kaskadenoperationen darzustellen. Für die Wartung von Zwischentabellen müssen das Kaskadenattribut nicht geschrieben werden.
5) umgekehrt
Im Allgemeinen müssen viele zu viele Beziehungen inverse = "True" nicht schreiben. Der Grund dafür ist, dass die andere Partei, die Daten einfügt, die Daten möglicherweise nicht in der Zwischentabelle enthält und die aktuelle Partei sie beibehalten muss. Daher kann Inverse = "True" nicht geschrieben werden. Ansonsten behält keine Partei diese Beziehung bei und es gibt Probleme mit den Daten.
6) Beispiel Java -Code
<span style = "Schriftgröße: 14px;"> // rollenrolle @test public void testDeleteroLe () {Session Session = hibernateUtil.getSession (); Transaktion TX = Session.BeginTransaction (); try {admin a = (admin) session.load (admin.class, 1); Rolle R1 = (Rolle) Sitzung.LOAD (ROLL.CLASS, 1); A.getroles (). Remove (R1); Sitzung.Update (a); tx.commit (); } catch (hibernateException e) {e.printstacktrace (); tx.rollback (); } endlich {Session.close (); }} // rolle @test public void testaddrol () {session session = hibernateUtil.getSession (); Transaktion TX = Session.BeginTransaction (); try {admin a = (admin) session.load (admin.class, 1); Rolle R1 = (Rolle) Sitzung.LOAD (ROLL.CLASS, 1); Rolle R2 = (Rolle) Sitzung.LOAD (ROLL.CLASS, 43); Rolle R3 = (Rolle) Sitzung.LOAD (ROLL.CLASS, 44); A.getroles (). add (r1); A.getroles (). Add (R2); A.getroles (). add (r3); Sitzung.Update (a); tx.commit (); } catch (hibernateException e) {e.printstacktrace (); tx.rollback (); } endlich {Session.close (); }} @Test public void testfind () {session session = hibernateUtil.getSession (); Transaktion TX = Session.BeginTransaction (); try {admin a = (admin) session.load (admin.class, 1); System.out.println ("----- Administratorinformationen anzeigen ----"); System.out.println (a.getId () + "" + a.getName () + "" + a.getTelephone ()); System.out.println ("---- Administrator-Rolleninformationen ---"); für (Rollenrolle: a.getroles ()) {System.out.println (rollen.getName () + ""); } tx.commit (); } catch (hibernateException e) {e.printstacktrace (); tx.rollback (); } endlich {Session.close (); }} </span>6. Vererbungsverein
Beispiel: Suchen Sie nach Produkten auf E-Commerce-Websites, z. B. auf der Suche nach iPhone. Die Suchergebnisse können Produktinformationen zu Mobiltelefonen, Handyfilmen, Mobilfunkkoffern, Ladegeräten, Kopfhörern usw. enthalten. Diese Funktion kann durch eine spezielle Eins-zu-Eins-Beziehung beim Entwerfen von Tabellen ausgedrückt werden. Das heißt, die gemeinsamen Attribute aller Produkte werden in ein gemeinsames Tabellenprodukt extrahiert. In der spezifischen Produkttabelle wird nur die spezifische Produkttabelle gespeichert, sodass die spezifische Produkttabelle und die Produkttabelle eine Eins-zu-Eins-Beziehung haben. Bei der Suche können Sie nur nach der Produkttabelle suchen und nach relevanten Informationen suchen.
-General Informationstabelle Produkt (ID, Name, Preis, Desc)
-Book Product List Book (ID, Authod, Publishing, Wörter)
-Ich hoffe, dass ich beim Betrieb der Buchtabelle automatisch gemeinsame Felder in der Produkttabelle verwalten kann.
1) klare Beziehung
Bücher und Produkte haben eine eins-zu-Eins-Beziehung. Der Zweck dieser Beziehung ist es, Felder in der Produkttabelle wiederzuverwenden, z. B. eine Erbschaftsbeziehung.
2) Entitätsklasse
Buch erweitert das Produkt
3) Verwandte Beziehungen spiegeln sich in Konfigurationsdateien wider
-Der übergeordnete Typ steht im Einklang mit der ursprünglichen Konfigurationsdatei-Schreibmethode
-Subtypen haben besondere Eigenschaften
<Joinde-Subclass-Name = "Typ name" table = "table name" extends = "übergeordnete Klasse name"> <Key Column = "Assoziationsfeldname"/> <Eigenschaft name = "" type = "" Column = ""/> ... </Joinde-Subclass>
4) In der Erbschaftsbeziehung müssen die Daten in der übergeordneten Tabelle in der untergeordneten Tabelle eine ähnliche Beziehung wie ein Elternteil und ein Kind haben . Es gibt keinen Fall von Nichtbeweis, dh die übergeordnete Tabelle muss bei der Aufrechterhaltung der untergeordneten Tabelle aufrechterhalten werden. Dies ist also eine feste Situation, sodass Sie keine Kaskade oder Inverse schreiben müssen.
5) Beschreibung Kategorie (Verständnis)
<SeND-SubClass> Die Datenbank verfügt
<NEINSUBCASS> Die Datenbank verfügt über eine Tabelle unter der Unterklasse und keine übergeordnete Klassentabelle (die Tabelle der Unterklasse enthält bereits das Feld der übergeordneten Klassen-Tabelle, keine übergeordnete Klassentabelle, hat jedoch übergeordnete Klassenentitätsobjekte).
<Subclass> Die Datenbank hat übergeordnete Klasse und untergeordnete Klasse und verwendet eine Tabelle (das Design ist chaotisch, dh keine Tabellenaufteilung und sie wird selten verwendet)
*7. Winterschlafanfrage
1) *HQL -Abfrage (Hibernate -Abfragesprache)
Es gehört zu einer objektorientierten Abfrageanweisung, in der das Pojo von Winterschlafate abfragt und damit die Abfrage der Datenbank erkannt hat.
A. Verwenden Sie den nicht primären Schlüssel, um eine bedingte Abfrage durchzuführen
-Konditionelle Parameter zu? Zeigt an, dass Abfrage.SetString (0, "");
-Die bedingten Parameter werden dargestellt durch: x, query.setstring ("x", "");
Beispielcode:
<span style = "Schriftgröße: 14px;"> // Test, um bedingt nach nicht-primärer Key @Test public void testfind1 () {String hql = "aus dem Dienst, wobei Account.id =? und Unixhost =?"; Session Session = hibernateUtil.getSession (); Query query = session.createquery (HQL); Query.SetInteger (0, 1011); Query.SetString (1, "192.168.0.23"); List <Service> list = query.list (); für (Service s: list) {System.out.println (S.GetID () + "" + S.GetOsusername () + " + S.GetunixHost ()); } Session.close (); } // entspricht TestFind1, mit ": identifier" anstelle von @test public void testfind2 () {String hql = "From Service Where Account.id =: Aid und UnixHost =: host"; Session Session = hibernateUtil.getSession (); Query query = session.createquery (HQL); Query.SetInteger ("Aid", 1011); Query.SetString ("Host", "192.168.0.23"); List <Service> list = query.list (); für (Service s: list) {System.out.println (S.GetID () + "" + S.GetOsusername () + " + S.GetunixHost ()); } Session.close (); } </span> B. Fragen Sie nur einige Attribute ab
-Die standardmäßige zurückgegebene Sammlung eingekapselt ist Objekt []
--New Service (ID, Unixhost, Osusername) umfasst das Dienstobjekt in der zurückgegebenen Kombination.
Beachten:
Ein Konstruktor, der eine Antwort im Dienst anhängen muss;
Wirf den parameterlosen Konstruktor nicht weg;
Beispielcode:
<span style = "Schriftgröße: 14px;"> // einige Feldergebnisse abrufen und Object [] verwenden, um Daten standardmäßig zu verkörpern @Test public void testfind3 () {String hql = "Select S.Id, S.unixhost, S.Osususername aus dem Dienst, wobei S.account.id =?" Session Session = hibernateUtil.getSession (); Query query = session.createquery (HQL); Query.SetInteger (0, 1011); List <Object []> list = query.list (); für (Object [] objs: list) {System.out.println (objs [0] + "" + objs [1] + "" + objs [2] + ""); } Session.close (); } // äquivalent zu TestFind3 müssen den entsprechenden Konstruktor @test public void testfind4 () {String hql = "Neuen Dienst (S.Id, s.unixhost, s.Osususername) aus dem Dienst s Where S. Account.id =?" hinzufügen; Session Session = hibernateUtil.getSession (); Query query = session.createquery (HQL); Query.SetInteger (0, 1011); List <Service> list = query.list (); für (Service s: list) {System.out.println (S.GetID () + "" + S.GetOsusername () + " + S.GetunixHost ()); } Session.close (); } </span> C. Die HQL -Definition befindet sich in der Konfigurationsdatei (nur verstehen)
-Definieren Sie die HQL in Konfigurationsdatei über ein Abfragelement
-Query-Element wird hinter der Klasse geschrieben
-siession.getNamedQuery (HQL-Name);
Beispielcode: <query/> und <klasse/> werden in HBm.xml auf derselben Ebene platziert
<span style = "Schriftgröße: 14px;"> <query name = "findAll"> <!-In CDATA einfache Textfelder in CDATA einbeziehen-> <! [CDATA [From Service]> </query> </span> <span style = "font-size: 14px; testfind5 () {session session = hibernateUtil.getSession (); // Die HQL -Anweisung in <query> in Hbm.xml query query = session.getNamedQuery ("findAll") erhalten; List <Service> list = query.list (); für (Service s: list) {System.out.println (S.GetID () + "" + S.GetOsusername () + " + S.GetunixHost ()); } Session.close (); } </span> D. Paginierungsanfrage
-Query Records
query.setFirstresult ((Seite)*pageSize);
query.setMaxResults (pageSize);
-Query die Gesamtzahl der Seiten
Wählen Sie Graf (*) aus dem Dienst
Beispielcode:
<span style = "Schriftgröße: 14px;"> // paging query @test public void testfind6 () {int page = 2; String hql = "Aus Dienstreihenfolge nach ID"; Session Session = hibernateUtil.getSession (); Query query = session.createquery (HQL); // Paging -Parameter hinzufügen, um query.setfirstresult zu setzen ((Seite - 1) * 3); // Setzen Sie den Ausgangspunkt für das Abholen von Datensätzen, ab 0 Abfrage System.out.println (S.GetID () + "" + S.GetOSusername () + "" + S.GetunixHost ()); } Session.close (); } // Wählen Sie count (*) aus service @test public void testfind7 () {String hql = "Wählen Sie count (*) aus dem Dienst"; Session Session = hibernateUtil.getSession (); Query query = session.createquery (HQL); Langgröße = (lange) Abfrage.Uniqueresult (); System.out.println ("Gesamtzahl der Datensätze:" + Größe); Sitzung.CLOSE (); } </span> e. Verwandte Abfrage (erinnern Sie sich nur an eine)
-From Service S, Konto a
wobei S. Account.id = A.id
-From Service S Innere Join S. Account a
-Auswahl S. Account.realname aus dem Dienst s
Zusammenfassen:
Die Ähnlichkeiten zwischen HQL und SQL :
-Support-Support Wählen Sie aus, wo, Gruppe, Bestellung nach Klausel
-Support Innere Join, Links Join und andere Verbindungen
-Support>, <,> =, <=, in, nicht in, zwischen, wie und anderen Bedingungen
-Support-Gruppierungsstatistikfunktionen zählen, sum, max, min, avg
Die Unterschiede zwischen HQL und SQL :
-HQL-Aussagen sind Fallempfindlichkeit, dh Fallempfindlichkeit. Schlüsselwörter sind nicht zu unterscheiden.
-HQL schreibt Objektnamen und Attributnamen, keine Tabellennamen und Feldnamen
-Die auf Klausel in Join on wird nicht unterstützt
-Auswahl wird nicht unterstützt *
-Domänenfunktionen werden nicht unterstützt, z. B. Datumsfunktion to_date (), Zeichenfunktion to_char () usw.
2) Kriterienanfragen (nicht intuitiv genug, einfach verstehen)
Verwenden Sie Hibernate -API, um einen HQL zu buchstabieren
Kriterien c = Sitzung.Createcriteria (Service.Class);
Beispielcode:
<span style = "Schriftgröße: 14px;"> // Verwenden Sie die API von Hibernate, um einen HQL @Test public void TestFind1 () {Session Session = hibernateUtil.getSession () zu buchstabieren; Kriterien c = Sitzung.Createcriteria (Service.Class); C.Add (Restriktions.and (Restriktions.ike ("Osusername", "Huang%"), Restrictions.eq ("Unixhost", "192.168.0.26"))); // Anhängen von Abfragebedingungen List <Service> List = C.List (); // Die Ausführung des Schalters. Append sort // c.setfirstresult (arg0); // pagination // C.SetMaxResults (arg0); für (Service s: list) {System.out.println (S.GetID () + "" + S.GetOsusername () + " + S.GetunixHost ()); } Session.close (); } </span> 3) SQL -Abfrage
Helfen Sie uns direkt, JDBC anzurufen, um SQL -Abfragen auszuführen
SQLQuery SQLQuery = Session.createSQLQuery (SQL);
Beispielcode:
<span style = "Schriftgröße: 14px;"> @test public void testfind1 () {String SQL = "SELECT * From Service"; Session Session = hibernateUtil.getSession (); SQLQuery SQLQuery = Session.createSQLQuery (SQL); sqlquery.setfirstresult (0); // pagination sqlQuery.setMaxResults (3); // standardmäßig wird ein Array verwendet, um eine Datensatzliste <Objekt []> list = sqlquery.list () zusammenzufassen; für (Object [] objs: list) {System.out.println (objs [0] + "" + objs [2]); } Session.close (); } // Geben Sie wie testFind1 () die Entität an, die den Datensatz @test public void testfind2 () {String sql = "aus dem Dienst auswählen"; Session Session = hibernateUtil.getSession (); SQLQuery SQLQuery = Session.createSQLQuery (SQL); sqlquery.setfirstresult (0); // pagination sqlQuery.setMaxResults (3); // Geben Sie die Entitätsklasse an, die den Datensatz sqlQuery.addentity (service.class) zusammenfasst; // Einen Datensatz mit der angegebenen Diensttypliste <Service> list = sqlQuery.list () zusammenfassen; für (Service S: Liste) {System.out.println (S.GetID () + "" s.getOsususername ()); } Session.close (); } </span>8. Hibernate Advanced Features (Verständnis)
1) Stufe 2 Cache
A. Stufe 2 Cache (Standard)
-Der Cache auf zweiter Ebene ist ein Cache auf SessionFactory-Ebene, der vom SessionFactory verwaltet wird
-Das zwischengespeicherte Objekt ist auch ein Entitätsobjekt
-Gekochte Daten können zwischen verschiedenen Sitzungen geteilt werden
-Applicable Umgebung: Häufige gemeinsame Objektdaten; Kleine Häufigkeit der Änderung der Objektdaten
B. Schritte zur Verwendung von Cache Level 2
-Dire-Cache-Paket ehcache.jar
-Import Cache-Konfigurationsdatei EHCache.xml
-In Hibernate.cfg.xml, so eingestellt, dass der sekundäre Cache aktiviert ist und die Cache-Treiberklasse festgelegt wird
<span style = "Schriftgröße: 14px;"> <!-Verwenden Sie Level 2 Cache-> <Eigenschaft name = "hibernate name = "hibernate.cache.provider_class"> org.hibernate.cache.ehcacheProvider </Property> </span>
-Setzen Sie das Element in der relationalen Zuordnungsdatei hbm.xml des Pojo ein, das zwischengespeichert werden kann.
Beispielcode:
<span style = "Schriftgröße: 14px;"> <span style = "Schriftgröße: 14px;"> @test public void testfind1 () {// Für die erste Abfrage, Session1 Session Session1 = HibernateUtil.getSession (); Service S1 = (Service) Sitzung1.get (Service.Class, 2002); System.out.println (s1.getOSusername () + "" + s1.getunixHost ()); Session1.CLOSE (); // Die zweite Abfrage verwendet Session2 (nach der Konfiguration des sekundären Cache gehen beide Abfragen zum sekundären Cache, um Daten abzurufen) // Hibernatutil.getSessionFactory (). Evict (Service.class); // Nach dem Entfernen werden Sie immer noch zweimal abfragen. Session Session2 = hibernateUtil.getSession (); Service S2 = (Service) Session2.get (Service.Class, 2002); System.out.println (s2getOSusername () + "" + S2GetunixHost ()); } </span> </span> 2) Abfragebatmen
A. Abfragesteuer
Caches Level 1 und Stufe 2 können nur einzelne Objekte zwischenspeichern. Wenn Sie auf ein String -Ergebnis, ein Arrayergebnis oder eine Listensammlung stoßen, können Sie den Speicher von Abfragestellen verwenden.
-Es kann als Spezial-Level-2-Cache angesehen werden
-Der verwendete Cache-Speicherplatz ist der Cache der zweiten Stufe
-Der Cache ist der Datentyp als das Entitätsobjekt
-Auf Level 2-Cache wird standardmäßig ausgeschaltet, und der Cache der Stufe 2 muss eingeschaltet werden, bevor er verwendet werden kann.
B. Schritte verwenden
-Open Level 2 Cache
-Setzen Sie den Abfrage-Cache in hibernate.cfg.xml ein
<span style = "Schriftgröße: 14px;"> <!-Abfragen-Cache einschalten-> <Eigenschaft name = "hibernate
Vor der Abfrage -query.list (), query.setCacheable (true);
C. Nutzungsumgebung
-Die gleiche Abfrageanweisung, die häufig ausgeführt werden muss
-Die Abfrageergebnis-Set-Inhalte ändert die Frequenz kleiner
-haben nicht zu viele Daten im Ergebnissatz. Tipp: Gehen Sie für dieselbe SQL zum ersten Mal in die Datenbank, um abfragen zu können, und steigen Sie in Zukunft mehrmals aus dem Cache aus. Weil der Inhalt der SQL+ -sergebnisse zwischengespeichert wird
Beispielcode:
<span style = "Schriftgröße: 14px;"> <span style = "Schriftgröße: 14px;"> @test public void testfind () {find (); System.out.println ("-------"); finden(); } private void find () {String hql = "From Service Where Account.id =?"; Session Session = hibernateUtil.getSession (); Query query = session.createquery (HQL); Query.SetInteger (0, 1011); // Query -Cache -Ausführung Query aktivieren. List <Service> list = query.list (); für (Service S: Liste) {System.out.println (S.GetID () + "" s.getOsususername ()); }} </span> </span>9. Selbstbewartungsverschiebung verarbeitungsverriegelt
Zum Beispiel:
Simulieren Sie den 12306 -Ticket -Kaufmechanismus unter der Annahme, dass derzeit ein Ticketticket (ID, Linie, Betrag, Version) von Zugkarten vorhanden ist, und simulieren Sie das Szenario, in dem mehrere Personen gleichzeitig Tickets kaufen.
1) Pessimistisches Schloss
-Das Programm ist pessimistisch, dass jeder Besucher über ein Parallelitätsproblem verfügt, sodass jedes Datenstück gesperrt wird. Dann kann der nächste Besucher nur dann auf die Daten zugreifen. Dieser Mechanismus wird als pessimistisches Schloss bezeichnet.
-Dies ist, dass Sie eine Daten sperren müssen, unabhängig davon, ob die Daten übereinstimmen.
--Merkmale
Geringe Effizienz und hohe Sicherheit
--erreichen:
GET (Klasse, ID, lockMode.Upgrade)
Wählen Sie * aus EMP für das Update aus
HINWEIS: Hier verwenden wir die für die Datenbank für das Sperren enthaltende Aktualisierungsklausel, nicht den von dem Winterschlaf selbst erfundenen Sperrmechanismus.
2) Optimistisches Schloss
-Das Programm ist optimistisch, dass jeder Besucher keine gleichzeitigen Probleme hat und keine Schlösser hinzufügt. Wenn die Daten aktualisiert werden, wird festgestellt, ob sich die Version der Daten geändert hat. Wenn es sich ändert, bedeutet dies, dass in diesem Zeitraum gleichzeitig das Auftreten auftritt. Daher wird ein Fehler gemeldet und das Update fehlgeschlagen.
-Mit der Hilfe des Versionsfeldes aktualisieren Hibernate das Feld um 1, sodass das vom nachfolgende Benutzer eingereichte Feld des Objektversionsfeldes das Feld aktualisiert wird als die in der Datenbank, dh wenn die Version während des Updates geändert wird, wird eine Ausnahme fehlgeschlagen, und das Update wird fehlschlagen.
-Einer Erfolg, andere scheitern
--Merkmale
Hohe Effizienz, schlechte Benutzererfahrung
--erreichen
A. Sie müssen das Versionsfeld an der Tabelle anhängen, um die Version der Daten aufzuzeichnen.
B. Append -Versionattribute an die Entitätsklasse anhängen;
C. Die Konfiguration der zusätzlichen Version in Hbm.xml <Versionsname = "" Typ = "" Column = "">
3) Wählen Sie aus
-Wenn die Parallelität groß ist, sollte die Optimismus-Sperre ausgewählt werden
-Wenn die Parallelität klein ist, sollten Sie ein pessimistisches Schloss wählen
Die oben genannten ist die umfassende Analyse von Hibernate -bezogenen Operationen, Abfrageoperationen, fortschrittlichen Merkmalen und Unterhaltungsverarbeitungsmechanismus, die vom Editor vorgestellt wurden. Ich hoffe, es wird Ihnen hilfreich sein. Wenn Sie Fragen haben, hinterlassen Sie mir bitte eine Nachricht und der Editor wird Ihnen rechtzeitig antworten. Vielen Dank für Ihre Unterstützung auf der Wulin.com -Website!