Das Unternehmen entwickelt Webanwendungen mit dem struts2-Framework. Diese Anwendung verwendet den Ruhezustand anstelle von JDBC für den DB-Zugriff, aber ich hatte Probleme, weil ich keine Kenntnisse hatte. In der Zwischenzeit bin ich auf die folgenden guten Bücher gestoßen, habe also den Inhalt verstanden und die wichtigsten Punkte zusammengefasst.
Verknüpfen Sie ein Java-Objekt (Objekt) mit Daten in einer relationalen Datenbank (Relational). Ein Hauptmerkmal von JPA ist, dass es eine O / R-Zuordnungsfunktion hat. Andererseits muss JDBC (*) die Zuordnung zwischen Objekten und DB programmieren. (Das Programm wird kompliziert.)
b. JPA(Java Persistence API) API in Java EE (*) enthalten. JPA ist nur eine Spezifikation, und es gibt mehrere Produkte, die JPA implementieren. Die Vertreter sind Hibernate, TopLink Essentials und Open JPA. Umweltaspekt: Kann mit Java EE und Java SE verwendet werden. JDK 5.0 oder höher ist erforderlich.
c. Hibernate
Eine Open-Source-JPA-Implementierung von Red Hat. Um Hibernate als JPA-Implementierung verwenden zu können, benötigen Sie drei Produkte: Hibernate Core, Hibernate Annotations und Hibernate Entity Manager. Im Vergleich zu JDBC sind die folgenden 4 Prozesse nicht erforderlich. (Details werden später beschrieben)
JPA ordnet eine Tabelle einer Java-Klasse durch O / R-Zuordnung zu und behandelt einen Datensatz der Tabelle als eine Instanz der Java-Klasse. In diesem Moment. Java-Klassen heißen ** Entitätsklassen **, ihre Instanzen heißen ** Entitäten ** und Entitäten werden über ** EntityManager ** behandelt.
Wenn eine Anwendung eine Entität anfordert, prüft EntityManager zunächst, ob sie in einem dauerhaften Kontext zwischengespeichert ist, und gibt die zwischengespeicherte Entität zurück, falls vorhanden.
Das Bild sieht so aus.
Es gibt zwei Arten von Methoden zur Entitätserfassung: die Primärschlüsselerfassung (1) und die JPQL-Erfassung (2).
Verwenden Sie die *** find-Methode *** von EntityManager, um eine Entität mit einem Primärschlüssel abzurufen.
Artikel | Erläuterung |
---|---|
Streit | Übergeben Sie die Entitätsklasse als erstes Argument und den Primärschlüsselwert als zweites Argument |
Rückgabewert | Wenn eine Entität existiert, diese Entität. Null, wenn es nicht existiert |
public void findById() throws Exception{
// EntityManager(em)Wird mit DI injiziert
//Holen Sie sich den Datensatz (Entität), dessen Primärschlüssel der Emp-Klasse (Tabelle) "1" ist.
Emp emp = em.find(Emp.class, 1L);
}
In dem Fall, in dem die Entität nicht durch Angabe des Primärschlüssels erfasst wird, kann die Suchmethode von EntityManager nicht verwendet werden, und es ist erforderlich, sie in JPQL zu implementieren. JPQL ist JPAs eigene Abfragesprache und unterscheidet sich grundlegend von SQL. In JPQL können Sie ein Abfrageobjekt erstellen, indem Sie ein Argument an die *** createQuery-Methode *** von EntityManager übergeben. Sie können Bindungsvariablenparameter und Paging-Informationen an Query übergeben. Die Entität kann durch Ausführen der Methode getResultList und der Methode getSingleResult von Query abgerufen werden.
Artikel | Erläuterung |
---|---|
Streit | jpql (Anfrage Text) |
Rückgabewert | Wenn es einen Datensatz gibt, der der Bedingung entspricht, wird die Liste der übereinstimmenden Entitäten angezeigt Leere Liste, falls nicht vorhanden (Größe = 0) |
Sie können die Daten aktualisieren, indem Sie die Entität, die Sie aktualisieren möchten, mit EntityManager abrufen und den Status dieser Entität ändern. EntityManager verwaltet die Originaldaten vor der Änderung, vergleicht die Originaldaten zu einem geeigneten Zeitpunkt mit den aktuellen Daten und erkennt die Aktualisierung automatisch. Eine Update-Anweisung wird automatisch ausgegeben, wenn festgestellt wird, dass eine Entität aktualisiert wurde.
(Der Zustand der Versionsspalte (später beschrieben), die für die optimistische ausschließliche Steuerung verwendet wird, wird automatisch zu der zu diesem Zeitpunkt ausgegebenen Update-Anweisung hinzugefügt.)
public void updateEntity() throws Exception{
// EntityManager(em)Wird mit DI injiziert
//Holen Sie sich den Datensatz (Entität), dessen Primärschlüssel der Emp-Klasse (Tabelle) "1" ist.
Emp emp = em.find(Emp.class, 1L);
emp.setEmpName("NEWNAME");
//Die Update-Anweisung wird automatisch ausgegeben
}
Übergeben Sie zum Hinzufügen einer Entität die neu erstellte Entität an die *** persist-Methode *** von EntityManager. Wenn die Annotation @GeneratedValue für den Primärschlüsseldatensatz in der zu betreibenden Entitätsklassendefinition angegeben ist, wird sie automatisch festgelegt, ohne einen Wert für das Primärschlüsselelement festzulegen.
public void persistEntity() throws Exception{
// EntityManager(em)Wird mit DI injiziert
//Generieren Sie die folgende Emp-Entität
Emp emp = new Emp();
emp.setEmpNo (123);
emp.setEnpName("123Name");
em.persist(emp);
//Einfügeanweisung wird automatisch ausgegeben
}
Übergeben Sie zum Entfernen einer Entität die zu entfernende Entität an die *** remove-Methode *** von EntityManager. EntityManager gibt zum richtigen Zeitpunkt eine SQL Delete-Anweisung aus.
(Der Zustand der Versionsspalte (später beschrieben), die für die optimistische ausschließliche Steuerung verwendet wird, wird automatisch zu der zu diesem Zeitpunkt ausgegebenen Delete-Anweisung hinzugefügt.)
public void removeEntity() throws Exception{
// EntityManager(em)Wird mit DI injiziert
//Löschen Sie die folgende Entität
em.remove(emp);
//Die Löschanweisung wird automatisch ausgegeben
}
Die für die O / R-Zuordnung erforderlichen Anmerkungen lauten wie folgt. Alle diese Anmerkungen gehören zum Paket "javax.persistence".
*** Geben Sie für das Abrufattribut von @ManyToOne, @OneToMany und @OneToOne grundsätzlich "fetchType.LAZY" an (später beschrieben). *** ***
No | Anmerkung | Angegebener Ort | Bedeutung zu repräsentieren |
---|---|---|---|
1 | @Entity | Klasse | Eine Einheit sein Entitätsname ist ein Name, der in JPQL verwendet wird, um eine Entität in der Java-Welt zu identifizieren. Beispiel:@Entity(name = "Hoge") |
2 | @Id | Feld | Sei der Primärschlüssel |
3 | @Transient | Feld | Sei nicht permanent Wird zugewiesen, wenn Sie keiner Spalte in der Datenbank zuordnen möchten |
4 | @GeneratedValue | Feld | Primärschlüsselwert automatisch generieren |
5 | @ManyToOne | Feld | Die Beziehung ist viele zu eins |
6 | @OneToMany | Feld | Die Beziehung ist eins zu viele |
7 | @OneToOne | Feld | Die Beziehung ist eins zu eins |
8 | @Table | Klasse | Geben Sie die zuzuordnende Tabelle an |
9 | @Column | Feld | Geben Sie an, dass es sich um eine Zuordnungszielspalte handelt Spalten ohne NOT NULL-Einschränkung müssen den Wrapper-Typ verwenden, um NULL darzustellen |
10 | @JoinColumn | Feld | Geben Sie die Quellenspalte und die Zielspalte an |
11 | @SequenceGenerator | Feld | Definition der Sequenz, die den Primärschlüssel generiert |
12 | @TableGenerator | Feld | Definition der Tabelle, die den Primärschlüssel generiert |
13 | @Version | Feld | Muss ein Versionsnummernfeld für die Verwendung einer optimistischen exklusiven Steuerung sein (siehe unten). Der Feldtyp sollte vom Typ Integer oder vom Typ Long sein |
Wenn eine Tabelle eine Eltern-Kind-Konfiguration hat, wird die untergeordnete Tabelle nicht erfasst, wenn die übergeordnete Tabelle erfasst wird, sondern bei Bedarf (auf der Rückseite).
Das Abrufattribut von @ManyToOne, @OneToMany und @OneToOne ist standardmäßig "fetchType.EAGER". Verwenden Sie daher das verzögerte Laden "fetchType.LAZY", es sei denn, Sie haben eine bestimmte Absicht.
Geben Sie einmal eine SELECT-Anweisung aus, um N Datensätze (übergeordnete Entitäten) aus einer beliebigen Tabelle abzurufen. N Datensätze geben einmal eine SELECT-Anweisung aus, um die zugehörigen Daten (untergeordnete Entität) abzurufen, insgesamt N-mal. Bitte beachten Sie, dass eine große Menge an SQL unbeabsichtigt ausgegeben wird. Es gibt die folgenden zwei Lösungen.
--Verwenden von JOIN FETCH mit JPQL -Verwenden Sie die Annotation @Fetch
Referenz
Geben Sie den Entitätsnamen (≠ Tabellenname) im Abschnitt FROM von JPQL an. Die Identifikationsvariable (im Folgenden in SQL als "e" bezeichnet) wird nach dem Entitätsnamen deklariert und die Extraktionselemente usw. werden damit angegeben.
select e from Employee e;
Bei verzögertem Laden werden untergeordnete Entitäten nur bei Bedarf abgerufen. Wenn andererseits bekannt ist, dass von Anfang an auch untergeordnete Entitäten erforderlich sind, ist es effizienter, sie gleichzeitig mit einem SQL zu erfassen. Verwenden Sie in solchen Fällen *** fetch join ***. Die SQL mit Fetch Join ist wie folgt.
select distinct d d from Department d inner join fetch d.employees where d.name = "ABC";
Nach dem Abrufen wird die Entität in einem dauerhaften Kontext verwaltet. Im persistenten Kontext wird es in den folgenden vier Zuständen verwaltet. Diese Zustände ändern sich aufgrund der Ausführung von EntityManager-Methoden und der Beendigung persistenter Kontexte und werden als *** Entity Lifecycle *** bezeichnet. Die Figur ist wie folgt.
--Neu Die neue Entität bleibt eine neue Entität, es sei denn, Sie geben die Persistenz- oder Zusammenführungsmethoden des EntityManager an.
--Gelang es Wenn eine Entität mit der find-Methode oder JPQL von EntityManager erfasst wird und die Entität von der persist-Methode von EntityManager an die Merge-Methode übergeben wird, wird die Entität in einem persistenten Kontext verwaltet. Permanente Feldänderungen für verwaltete Entitäten werden automatisch erkannt.
--Löste sich Selbst wenn Sie Änderungen an der isolierten Entität vornehmen, werden die Änderungen nicht im Persistenzkontext wiedergegeben, es sei denn, die Entität wird durch die Zusammenführungsmethode von EntityManager erneut verwaltet.
EntityManager spiegelt verwaltete und gelöschte Entitäten in der Datenbank wider. Dieser Vorgang wird als *** Datenbanksynchronisation *** bezeichnet. Durch die Synchronisierung werden die im Persistenzkontext gespeicherten Entitätsänderungsinformationen in die Datenbank geschrieben.
Der Standardzeitpunkt für die Datenbanksynchronisierung lautet wie folgt:
--Wenn die Flush-Methode von EntityManager aufgerufen wird --Nur bevor die Transaktion festgeschrieben wird --Nur vor der Ausführung der Anfrage
Die exklusive Kontrolle umfasst eine pessimistische exklusive Kontrolle, die bestimmte Daten sperrt und CRUD von anderen Transaktionen ausschließt, sowie eine optimistische exklusive Kontrolle, die keine Daten sperrt und die andere Verarbeitung im Falle eines Aktualisierungskonflikts fehlschlägt. ..
JPA kann basierend auf dieser Versionsnummer eine optimistische exklusive Kontrolle realisieren, indem eine Spalte vom Typ Integer erstellt wird, die die Versionsnummer (@ Versionszuweisung) in der Datenbank verwaltet.
<property name = "hibernate.show_sql" value = "true" />
<property name = "hibernate.format_sql" value = "true" />