[JAVA] Fassen Sie die wichtigsten Punkte für den Einstieg in JPA zusammen, die Sie mit Hibernate gelernt haben

1. Motivation

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.

2. Angezeigte Schlüsselwörter

3. Glossar

a. O / R-Zuordnung

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)

4. Implementieren der Datenerfassung / Aktualisierung / Hinzufügung / Löschung

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.

画像1.png

a. Datenerfassung

Es gibt zwei Arten von Methoden zur Entitätserfassung: die Primärschlüsselerfassung (1) und die JPQL-Erfassung (2).

(1) Erwerb durch das Unternehmen

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);
}
(2) Erwerb durch JPQL

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)

b. Datenaktualisierung

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
}

c. Daten hinzufügen

Ü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
}

d. Daten löschen

Ü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
}

5. O / R-Zuordnung

a. Anmerkung

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

b. Faules Laden

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.

C. N + 1 Problem

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

  1. JPQL JPQL wird von der JPA-Implementierung interpretiert, in SQL konvertiert, das für die zu verwendende Datenbank geeignet ist, und dann ausgeführt. SQL hat einen Dialekt für jede Datenbank, aber durch die Verwendung von JPQL können einige Unterschiede zwischen Dialekten ausgeglichen werden.

a. Grammatik und Terminologie

(1) Entitätsname und Identifikationsvariable

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;
(2) Join abrufen

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";

7. Entitätslebenszyklus

a. Vier Zustände der Entität

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.

画像2.png

b. Datenbanksynchronisation

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

8. JPA optimistische exklusive Kontrolle

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.


* Extra Edition * Wissenswertes

<property name = "hibernate.show_sql" value = "true" />

<property name = "hibernate.format_sql" value = "true" />


Recommended Posts

Fassen Sie die wichtigsten Punkte für den Einstieg in JPA zusammen, die Sie mit Hibernate gelernt haben
Beginnen Sie mit der Funktionsweise von JVM GC
Erste Schritte mit der Doma-Projektion mit der Criteira-API
Erste Schritte mit Doma-Using Joins mit der Criteira-API
Erste Schritte mit Doma-Einführung in die Kriterien-API
Erste Schritte mit DBUnit
Erste Schritte mit Ruby
Erste Schritte mit Swift
Erste Schritte mit Doma-Transaktionen
Erste Schritte mit Doma-Dynamic Erstellen von WHERE-Klauseln mit der Kriterien-API
Erste Schritte mit Reactive Streams und der JDK 9 Flow API
Erste Schritte mit der Git Hub Container Registry anstelle von Docker Hub
Erste Schritte mit der Verarbeitung von Doma-Annotationen
Erste Schritte mit Java Collection
Erste Schritte mit JSP & Servlet
Erste Schritte mit Java Basics
Fassen Sie die Wörter zusammen, die Sie gelernt haben
Erste Schritte mit Spring Boot
Erste Schritte mit Ruby-Modulen
Generieren Sie mit TableGenerator of Hibernate (JPA) eine Seriennummer und speichern Sie diese in der ID von String.
Zurück zum Anfang, Erste Schritte mit Java ② Steueranweisungen, Schleifenanweisungen
Sehen Sie sich das Verhalten von Entitätsaktualisierungen mit Spring Boot + Spring Data JPA an
Erste Schritte mit Doma-using Logical Operators wie AND und OR in der WHERE-Klausel der Criteria-API
Erste Schritte mit Java_Kapitel 5_Praktische Übungen 5_4
[Google Cloud] Erste Schritte mit Docker
Erste Schritte mit Docker mit VS-Code
Fügen Sie @ManyToOne zu einem Teil des zusammengesetzten Primärschlüssels in Hibernate JPA hinzu
Ich habe versucht, die wichtigsten Punkte des gRPC-Designs und der Entwicklung zusammenzufassen
Bevor Sie die Funktionen und Punkte der Furima-App vergessen