

Bibliotheken und Standards
52. Was ist Ruhezustand? Was ist der Unterschied zwischen JPA und Hibernate?
Um diese Frage zu beantworten, müssen wir meiner Meinung nach zunächst verstehen, was JPA ist. Dabei handelt es sich um eine Spezifikation, die eine objektrelationale Zuordnung einfacher Java-Objekte beschreibt und eine API zum Speichern, Abrufen und Bearbeiten solcher Objekte bereitstellt. Das heißt, relationale Datenbanken (DBs) werden als eine Reihe miteinander verbundener Tabellen dargestellt. Und JPA ist ein weit verbreiteter Standard, der beschreibt, wie Objekte mit relationalen Datenbanken interagieren können. Wie Sie sehen, ist JPA etwas Abstraktes und Immaterielles. Es ist wie die Idee selbst, der Ansatz.
53. Was ist Kaskadierung? Wie wird es im Ruhezustand verwendet?
Wie ich bereits sagte, erfolgt die Kommunikation im Ruhezustand über Datenobjekte, sogenannte Entitäten. Diese Entitäten repräsentieren bestimmte Tabellen in der Datenbank, und wie Sie sich erinnern, können Java-Klassen Verweise auf andere Klassen enthalten. Diese Beziehungen spiegeln sich auch in der Datenbank wider. In der Regel handelt es sich entweder um Fremdschlüssel (für OneToOne-, OneToMany-, ManyToOne-Beziehungen) oder um Zwischentabellen (für ManyToMany-Beziehungen). Wenn Ihre Entität Verweise auf andere verwandte Entitäten aufweist, werden über diesen Verweisen Anmerkungen platziert, um die Art der Beziehung anzugeben: @OneToOne, @OneToMany, @ManyToOne, @ManyToMany. Sie können den Kaskadentyp für diese Beziehung in der Kaskadeneigenschaft der Anmerkungen angeben. JPA verfügt über spezifische Methoden für die Interaktion mit Entitäten (beibehalten, speichern, zusammenführen ...). Kaskadentypen werden verwendet, um zu zeigen, wie sich verwandte Daten verhalten sollen; Diese Methoden werden für eine Zielentität verwendet. Was sind also die Kaskadenstrategien (Kaskadentypen)? Der JPA-Standard sieht die Verwendung von sechs Kaskadentypen vor:-
PERSIST – Speichervorgänge erfolgen in einer Kaskade (für die Methoden save() und persist() ). Mit anderen Worten: Wenn wir eine Entität speichern, die mit anderen Entitäten verknüpft ist, werden diese Entitäten auch in der Datenbank gespeichert (sofern sie nicht bereits vorhanden sind).
-
MERGE – Aktualisierungsvorgänge erfolgen in einer Kaskade (für die Methode merge() )
-
REMOVE – Löschvorgänge erfolgen in einer Kaskade ( remove()- Methode)
-
ALL – enthält drei kaskadierende Vorgänge gleichzeitig – PERSIST – MERGE – REMOVE
-
DETACH – verwandte Entitäten werden nicht von der Sitzung verwaltet ( detach() -Methode). Das heißt, wenn die Daten der zugehörigen Entitäten geändert werden, werden die Daten in der Datenbank nicht automatisch aktualisiert – sie werden von persistent in getrennt konvertiert (d. h. die Entität wird nicht von JPA verwaltet).
-
REFRESH – jedes Mal, wenn eine Entität mit Daten aus der Datenbank aktualisiert wird ( restart() – aktualisiert getrennte Objekte), werden auch die zugehörigen Entitäten aktualisiert. Sie haben beispielsweise die aus der Datenbank entnommenen Daten irgendwie geändert und möchten die ursprünglichen Werte wiederherstellen. In diesem Fall ist dieser Vorgang hilfreich.

-
REPLICATE – wird verwendet, wenn wir mehr als eine Datenquelle haben und die Daten synchronisiert werden sollen (Replikationsmethode von Hibernate). Alle Entitäten müssen über Identifikatoren (ID) verfügen, um sicherzustellen, dass sie problemlos erstellt werden können (um sicherzustellen, dass dieselbe Entität nicht unterschiedliche IDs für verschiedene Datenbanken hat).
-
SAVE_UPDATE – kaskadierendes Speichern/Löschen (für die saveOrUpdate- Methode von Hibernate)
-
LOCK – das Gegenteil der DETACHED- Operation: Konvertiert eine getrennte Entität zurück in den dauerhaften Zustand, dh die aktuelle Sitzung verfolgt die Entität erneut
54. Kann eine Entity-Klasse abstrakt sein?
Gemäß 2.1 Die Entitätsklasse der JPA-Spezifikation „ können sowohl abstrakte als auch konkrete Klassen Entitäten sein. “ Die Antwort lautet also: Ja, eine abstrakte Klasse kann eine Entität sein und mit der Annotation @Entity markiert werden.55. Was ist ein Entity Manager? Wofür ist es verantwortlich?
Zunächst möchte ich darauf hinweisen, dass EntityManager eine entscheidende Komponente von JPA ist . Es wird für die Interaktion von Entitäten mit der Datenbank verwendet. Im Allgemeinen werden Methoden für die Interaktion der Entität mit der Datenbank auf der Entität aufgerufen (Persist, Merge, Remove, Detach) ... Ich stelle jedoch auch fest, dass diese Komponente normalerweise kein Singleton für die gesamte Anwendung ist. Es ist oft leichtgewichtig, eines wird gelöscht und ein neues wird mit der EntityManagerFactory erstellt . Wenn wir eine Parallele zu JDBC ziehen , wo EntityManagerFactory analog zu DataSource ist , dann ist EntityManager analog zu Connection . Ich habe bereits erwähnt, dass eine persistente Entität eine Entität ist, die von der aktuellen Verbindung verwaltet wird. Diese Entität wird vom EntityManager verwaltet , der eng mit der aktuellen Verbindung verbunden ist, und vom TransactionManager , der für das Öffnen/Schließen von Transaktionen verantwortlich ist. In der folgenden Abbildung können Sie den Lebenszyklus der Entität sehen:
56. Was ist die Assert-Klasse? Warum wird es verwendet?
Ich habe noch nie von einer solchen Klasse in JPA gehört , daher gehe ich davon aus, dass sich diese Frage auf eine Klasse in der JUnit-Bibliothek bezieht, die für Komponententests verwendet wird. In dieser Bibliothek wird die Assert- Klasse verwendet, um die Ergebnisse der Codeausführung zu überprüfen (hier bedeutet „Assert“ eine Behauptung, dass Sie an einer bestimmten Stelle im Code über einen bestimmten Status/Daten verfügen). Nehmen wir zum Beispiel an, Sie testen eine Methode, die eine Katze erstellen soll. Sie führen die Methode aus und erhalten ein Ergebnis:Cat resultOfTest = createCat();
Aber Sie müssen sicherstellen, dass es korrekt erstellt wurde, oder? Sie erstellen also manuell eine bestimmte Katze ( erwartete Katze ) mit genau den Parametern, die Sie in der Katze erwarten, die Sie mit der Methode createCat() erhalten haben . Anschließend verwenden Sie die Assert- Klasse, um die Ergebnisse zu überprüfen:
Assert.assertEquals(resultOfTest, expectedCat);
Wenn die Katzen unterschiedlich sind, wird ein AssertionError ausgelöst, der uns mitteilt, dass wir nicht die erwarteten Ergebnisse erhalten haben. Die Assert- Klasse verfügt über viele verschiedene Methoden, die eine Vielzahl von Vorgängen abdecken, die bei der Überprüfung erwarteter Ergebnisse hilfreich sind. Hier sind einige davon:
-
affirmTrue(<boolean>) – Es wird erwartet, dass der als Argument übergebene Wert wahr ist
-
behauptenFalse(<boolean>) – Der als Argument übergebene Wert wird voraussichtlich falsch sein
-
affirmNotEquals(<object1>, <object2>) – die als Argumente übergebenen Objekte müssen unterschiedlich sein, wenn sie mit „equals“ verglichen werden ( false )
-
behauptenThrows(<ClassNameOfException>.class, <ExceptionObject>) – Es wird erwartet, dass das zweite Argument eine vom ersten Argument ausgelöste Ausnahme ist (d. h. das zweite Argument ist normalerweise ein Methodenaufruf, der eine Ausnahme des erforderlichen Typs auslösen sollte)
Zeichenfolge
57. Beschreiben Sie die String-Klasse von Java
String ist eine Standard-Java-Klasse, die für das Speichern und Bearbeiten von String-Werten (Zeichenfolgen) verantwortlich ist. Es handelt sich um eine unveränderliche Klasse (über unveränderlich habe ich bereits hier geschrieben ), das heißt, die Daten von Objekten dieser Klasse können nach ihrer Erstellung nicht mehr geändert werden. Ich möchte sofort darauf hinweisen, dass die Klassen StringBuilder und StringBuffer im Wesentlichen identisch sind – der einzige Unterschied besteht darin, dass eine von ihnen für die Verwendung in einer Multithread-Umgebung ( StringBuffer ) vorgesehen ist. Diese Klassen ähneln String , unterscheiden sich jedoch darin, dass sie veränderbar sind . Selbst nachdem sie erstellt wurden, können Sie die von ihnen dargestellten Zeichenfolgen ändern, ohne ein neues Objekt erstellen zu müssen. Ihre Methoden unterscheiden sich von den Standard- String- Methoden und sind für die String-Manipulation konzipiert (es gibt einen Grund, warum sie sie als Builder bezeichnen).58. Welche Möglichkeiten gibt es, ein String-Objekt zu erstellen? Wo entsteht es?
Die gebräuchlichste Methode zum Erstellen einer Zeichenfolge besteht darin, den gewünschten Wert einfach in doppelten Anführungszeichen anzugeben:String str = "Hello World!";
Sie können dies auch explizit mit new tun :
String str = new String("Hello World!");
Sie können auch eine Zeichenfolge aus einem Array von Zeichen erstellen:
char[] charArr = {'H','e','l','l','o',' ', 'W','o','r','l','d','!'};
String str = new String(charArr);
Wir können dies tun, indem wir die toString -Methode für ein Objekt aufrufen :
String str = someObject.toString();
Wir können dies tun, indem wir jede andere Methode aufrufen, die einen String zurückgibt. Beispiel:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String str = reader.readLine();
Sie verstehen, dass es viele, viele Möglichkeiten gibt, eine Zeichenfolge zu erstellen. Wenn ein String- Objekt erstellt wird, wird es in einem String-Pool gespeichert , worauf wir in einer der folgenden Fragen näher eingehen.
59. Wie vergleicht man zwei Java-Strings und wie sortiert man sie?
Java verwendet ein doppeltes Gleichheitszeichen ( == ), um Vergleiche durchzuführen. Wenn wir einfache Werte wie Ganzzahlen vergleichen müssen, verwenden wir diese. Für den Vergleich vollwertiger Objekte ist diese Methode jedoch nicht geeignet. Es werden nur Referenzen verglichen, dh ob die Referenzen auf dasselbe Objekt verweisen oder nicht. Das heißt, wenn wir zwei Objekte mit den gleichen Feldwerten mit == vergleichen , erhalten wir false . Die Felder haben die gleichen Werte, aber die Objekte selbst belegen unterschiedliche Speicherorte. String- Objekte sind trotz ihrer trügerischen Einfachheit immer noch Objekte. Ein Vergleich mit == ist ebenfalls nicht angemessen (trotz des Vorhandenseins eines String-Pools). Die richtige Lösung ist die Standard- Equals- Methode der Object- Klasse , die überschrieben werden muss, damit sie ordnungsgemäß funktioniert (standardmäßig wird == für Vergleiche verwendet). Die String- Klasse überschreibt sie, daher verwenden wir einfach ihre Implementierung:String firstStr = "Hello World!";
String secondStr = "Hello World!";
boolean isEquals = firstStr.equals(secondStr);

TreeSet<String> sortedSet = new TreeSet<>();
sortedSet.add("B");
sortedSet.add("C");
sortedSet.add("A");
sortedSet.forEach(System.out::println);
Konsolenausgabe:
60. Stellen Sie einen Algorithmus zum Konvertieren einer Zeichenfolge in Zeichen bereit. Schreiben Sie den entsprechenden Code
Wie ich bereits sagte, verfügen String- Objekte über viele verschiedene nützliche Methoden. Eines davon ist toCharArray . Diese Methode wandelt einen String in ein Zeichenarray um:String str = "Hello world";
char[] charArr = str.toCharArray();
Als nächstes haben wir ein Array von Zeichen, auf die wir per Index verweisen können:
char firstChar = charArr[0]; // H
61. Wie konvertiert man einen String in ein Byte-Array und zurück? Schreiben Sie den entsprechenden Code
Die String- Klasse verfügt über eine getBytes- Methode, die der toCharArray- Methode ähnelt und den String als Byte-Array zurückgibt:String str = "Hello world";
byte[] byteArr = str.getBytes();
byte firstChar = byteArr[6]; // 119
Wir sind heute zu dem logischen Ergebnis unserer Rezension gekommen. Danke fürs Lesen!
GO TO FULL VERSION