Unsere Datenschutzrichtlinie wird in Kürze aktualisiert. Bitte sehen Sie sich die Vorschau an.

Java EE 7 Grundkurs

Entitäten definieren und Abfragen ausführen

Testen Sie unsere 2013 Kurse

10 Tage kostenlos!

Jetzt testen Alle Abonnements anzeigen
Dieses Video bietet einen Überblick über Entitäten sowie die Vorgehensweise bei deren Definition. Zusätzlich erläutert der Trainer den Interface Entity Manager und die Methoden für die Ausführung von Operationen auf Objekten.

Transkript

Ein ganz wesentlicher Bestandteil der Arbeit mit der JPA ist das Arbeiten mit der JPA. Damit Sie mit der JPA vernünftig arbeiten können, müssen Sie Entitäten definieren. Und anschließend können Sie auf Ebene dieser Entitäten Abfragen ausführen. Genaus dies werden wir in diesem Video besprechen. Entitäten sind grundsätzlich erst einmal ganz normale Java-Klassen, Plain Old Java Objects, also POJOs. Diese Java-Klassen sind mit der Entity-Annotation versehen. Jede Entität, also jede Java-Klasse, die mit der Entity-Annotation versehen ist, benötigt mindestens eine Id-Annotation. Grundsätzlich ist es so, dass Entitäten immer einen Standardkonstruktor brauchen, das bedeutet einen Konstruktor, der public ist und der keinen Parameter entgegennimmt. Ebenfalls ist es so, dass alle Eigenschaften einer Entität automatisch in die Datenbank gespeichert werden, es sei denn sie sind als "Transient" markiert. Im Standard gibt es einige Konventionen. So ist es so, dass der Tabellenname in der Datenbanktabelle dem Klassennamen der Bean entsprechen muss. Und ein Spaltenname in einer Datenbanktabelle entspricht dann einem Eigenschaftsnamen. Diese Konventionen können angepasst werden. Auch dafür gibt es Annotationen. Wenn wir einen Identifier definieren wollen, verwenden wir die Id-Annotation. Wie gesagt: Die Id-Annotation ist zwingend nötig. Optional können wir mit Hilfe der GeneratedValue-Annotation angeben, wie dieser Identifier generiert wird. Hier stehen verschiedene Strategien zur Auswahl. "AUTO" ist die Strategie, bei der wir dem OR-Mapping-Framework überlassen, was der beste Ansatz ist. "IDENTITY" sagt, dass ein identity- oder auto-Wert, das heißt je nach Datenbank anders, verwendet wird. Dieser Ansatz funktioniert beispielsweise bei Microsoft SQL-Server und bei der MySQL-Datenbank. "SEQUENCE" ist ein Ansatz, bei dem intern eine Sequenz verwendet wird. Dieser Ansatz funktioniert beispielsweise mit Oracle oder DB2. Dabei gibt die SequenceGenerator-Annotation an, welche Sequenz verwendet wird. Geben Sie das nicht an, wird ein Standard-Sequenzname angenommen. Sollten weder "IDENTITY" noch "SEQUENCE" passend sein, können Sie den TABLE-Ansatz benutzen. Dabei gibt es eine spezielle Datenbanktabelle. Optional gibt TableGenerator als Annotation an, welche Tabelle zu nutzen ist. Sie sollten diesen Ansatz aber auch nur wirklich dann benutzen, wenn es keine Alternativen gibt, denn er ist langsam und fehlerträchtig. Sie können generell die Annotationen, also beispielsweise "Id" beziehungsweise "Transient" auf Ebene von Feldern oder von Gettern erfassen. Beide Ansätze können benutzt werden. Und die Kombination beider Ansätze ist sogar möglich, sollte allerdings nicht empfohlen werden. Die JPA verwendet für gewöhnlich die Konvention, die mit Hilfe der Id-Annotation angezeigt worden ist. Das bedeutet, liegt die Id-Annotation auf einem Feld, dann wird der feldbasierte Ansatz verwendet. Liegt die Id-Annotation auf einem Getter, dann wird der getterbasierte Ansatz verwendet. Die Konvention im Java-Umfeld ist, diese Annotationen auf Feldern zu deklarieren. Wenn Sie Getter benutzen, wie gesagt ein voll und ganz valider Ansatz, dann müssen das bitte Bean-Style-Getter sein, das heißt Getter, die etwas zurückgeben und keinen Parameter entgegennehmen. Bevor Sie JPA-Operationen ausführen können, müssen Sie einige Grundvoraussetzungen erfüllen können. Zum einen muss in Ihren Klassen ein EntityManager injiziert sein. Zum anderen muss die Datei "persistence.xml" im META-INF-Verzeichnis existieren. Und, ganz wichtig, die Konfiguration muss passen. Transaktionen werden bei CDI- und EJB-Komponenten automatisch vorgenommen. Dies muss jedoch nicht sein. Sie können das auch händisch erledigen. Die JPA definiert einige Standardoperationen. "CRUD" heißt Create, Read, Update und Delete. Und genau diese Operationen werden hier verwendet. "Create" wird über die Persist-Methode eines EntityManagers ausgeführt. "Read" wird mit Hilfe der find- oder executeQuery-Methoden ausgeführt. Find sucht dabei immer nur nach dem Primärschlüssel. ExecuteQuery erlaubt es uns, JPQL-Abfragen zu definieren. "Update" funktioniert über die Methoden "merge" oder "refresh". Merge nimmt dabei die übergebene Instanz und behält die Daten bei, bringt sie aber in den Kontext des EntityManagers zurück. Und refresh nimmt die übergebene Instanz und befüllt sie mit den Daten aus der Datenbank, sodass die enthaltenen Daten verloren gehen. "Delete" entfernt eine Instanz. Ausgedrückt wird dies über die remove-Methode. Wenn Sie Abfragen definieren wollen, verwenden Sie JPQL-Statements. Innerhalb dieser JPQL-Statements können optional Parameter definiert sein. Wir sehen hier ein JPQL-Statement, bei dem ein Parameter "name" deklariert ist. Und dieser Parameter "name" wird ausgedrückt durch ":name". Wenn wir so einen Parameter angegeben haben, dann müssen wir ihn natürlich auch mit einem Wert versehen. Dies machen wir über die Methode "setParameter" des Query-Objekts. Der erste Parameter dieser Methode ist der Name des Parameters, diesmal jedoch ohne den führenden Doppelpunkt. Und der zweite Parameter ist dann der Wert, der an die Datenbank übergeben werden soll. Am Ende rufen wir das Ergebnis über die Methode "getResultList" oder über die Methode "getSingleResult" ab. Wir haben bei der JPA generell verschiedene Arten von Abfragen, die wir anwenden können. So gibt es zum einen die Query. Die Query ist eine einfache Abfrage, die direkt im Quellcode an der Stelle definiert ist, an der ich sie ausführen möchte. Es gibt die NamedQuery. Die NamedQuery ist auch eine einfache JPQL-Abfrage, die aber benannt ist, das heißt sie wird über einen symbolischen Namen referenziert und auf Klassenebene per Annotation definiert. Ebenfalls haben wir die Möglichkeit, SQL-Statements direkt abzusetzen. Das machen wir mit einer NativeQuery. Die NativeQuery gibt es auch als NamedNativeQuery. Und das ist dann wieder eine benannte Abfrage, die über einen symbolischen Namen beim EntityManager referenziert wird und auf Klassenebene per Annotation definiert ist. Dazu gibt es die Möglichkeit, auf StoredProcedures Abfragen zu machen. Dies machen wir mit einer StoredProcedureQuery. Und auch StoredProcedureQueries können benannt sein. Das bedeutet, sie sind auf Klassenebene mit einem symbolischen Namen definiert und werden vom EntityManager dann über diesen symbolischen Namen referenziert. Daten, die in die Datenbank wandern sollen, müssen natürlich auf irgendeine Art und Weise überprüft werden. Dafür können wir das Beans- Validation-Framework benutzen. Die entsprechenden Annotationen und Beschränkungen werden dabei auf Ebene der Felder annotiert. Es gibt einige Einschränkungen, die man sinnvoll ansetzen kann. "NotNull" gibt zum Beispiel an, dass das Feld eben nicht Null sein darf. "AssertTrue" oder "AssertFalse" geben an, dass in dem jeweiligen booleschen Feld immer nur der Wert "true" oder "false" sein darf. Ist dies nicht gegeben, gibt es eine Exception. "Min" und "DecemalMin" geben Minimalwerte an. "Max" und "DecemalMax" geben Maximalwerte an. "Size" funktioniert auf Ebene von Zeichenketten und gibt deren Längen an, minimal und maximal. "Digits" gibt an, wieviele Ziffern enthalten sein dürfen. Und "Pattern" erlaubt es uns, einen regulären Ausdruck zu definieren. Die Überprüfungen anhand dieser Einschränkungen finden bei jedem Speichervorgang statt. Und die Validierung ist auch standardmäßig aktiv. Das heißt, Sie dürfen sie sofort einsetzen. Das Ganze kann optional in der persistence.xml geändert werden. Sollte gegen eine dieser Bedingungen verstoßen werden, dann wird die aktuelle Transaktion zurückgerollt. Mit diesen Informationen haben wir den kompletten Überblick über die grundsätzliche Arbeit mit der JPA geschaffen. Wir haben uns darüber unterhalten, was Entitäten sind, wie wir CRUD-Operationen ausführen können und wie wir Daten überprüfen können. Wir werden dieses Wissen in der weiteren Beschäftigung mit der JPA ständig benötigen. Deswegen ist es wichtig, sich mit diesen Themen regelmäßig und intensiv auseinanderzusetzen.

Java EE 7 Grundkurs

Lernen Sie die Grundlagen der Programmierung mit Java EE 7 verstehen und anwenden.

6 Std. 4 min (44 Videos)
Derzeit sind keine Feedbacks vorhanden...
 

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!