Am 14. September 2017 haben wir eine überarbeitete Fassung unserer Datenschutzrichtlinie veröffentlicht. Wenn Sie video2brain.com weiterhin nutzen, erklären Sie sich mit diesem überarbeiteten Dokument einverstanden. Bitte lesen Sie es deshalb sorgfältig durch.

Java EE 7: Web Services

Datenschicht

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
Die Datenschicht stellt die Verbindung zwischen Datenbank und Applikation dar. Hier lernen Sie den Aufbau des DataLayers kennen, konfigurieren den Datenbankzugriff und implementieren Entitäten und Datenzugriffslogik.

Transkript

In diesem Video werden wir uns damit auseinandersetzen, wie wir die Datenschicht unserer Applikation implementieren können. Wir werden hier zunächst die Entitäten aufsetzen und danach eine Stateless Session Bean für den Zugriff auf die Entitäten definieren. Ebenfalls werden wir die persistence.xml-Datei anlegen und mit unserer Datenquelle verknüpfen. Die Entitäten, die wir definieren wollen, werden als JPA-Entitäten definiert. Das heißt, es sind ganz normale Klassen, Die mit table und ID-Annotation versehen sind. Der Datenzugriff wird mit Hilfe einer Stateless Session Bean realisiert, dort lassen wir uns dann den Persistence-Kontext injizieren. Auf dem Daten-Layer wollen wir zum einen unsere Adressen und unsere Kunden verwalten, und zum anderen werden wir hier an dieser Stelle auch ein sogenanntes DTO, ein Data Transfer Object also ein Datentransferobjekt, definieren. Zu diesem Zweck habe ich hier bereits einmal drei Packages angelegt, nämlich die de.videio2brain.customers.beans. In beans-Packages befindet sich die eigentliche Stateless Session Bean, die der Verwaltung der Daten dient, es gibt das Package DTO dort befindet sich das Data Transfer Object mit dem Namen BaseCustomerData. Und es gibt das Package models, da befinden sich dann die eigentlichen Entitäten, die wir in der Datenbank speichern und darüber verwalten wollen, drin definiert. Sehen wir uns zunächst einmal die Klasse BaseCustomerData an. Diese Klasse ist ein sogenanntes Data-Transfer-Object, also ein Datentransferobjekt. Aufgabe von so einem Datatransferobjekt ist es, dass die Daten, die aus der Datenbank geladen werden, runterbrochen werden auf eine Größe und Menge, wie sie ein Client auch sinnvoll verarbeiten kann. Damit wird am Ende des Tages dafür gesorgt, dass weniger Daten vom Server zum Client transportiert werden müssen und dadurch kann der Client schneller dann auch zur Datenanzeige schreiten. So ein Data Transfer Object ist eine ganz normale Java-Klasse. Sie verfügt in diesem Fall über drei Eigenschaften, id, firstName und lastName, wie zu unschwer erkennen können, sind das die Grundeigenschaften eines Kunden, daher auch der Name BaseCustomerData. Es gibt in dieser Klasse entsprechende Getter und Setter, um den Zugriff zu ermöglichen und wir haben einen überladenen Constructor, einmal den Standard-Construktor und dann einen Constructor wo wir direkt beim Aufruf schon ID, Vorname und Nachname rein übergeben können. Wie wir diese Klasse verwenden, werden wir gleich sehen. Dann widmen wir uns den Entitäten. Wir haben zwei Entitäten, Customer und Address. Werfen wir zunächst einen Blick auf die Klasse Address. Diese repräsentiert eine Adresse und besteht aus sechs Feldern. id, street, number, zip, City und country. und das sind die Felder für den Datensatz-Identifier, für Straße, für Hausnummer, für Postleitzahl, für Stadt und fürs Land. Damit diese Klasse als Entität verwaltbar wird, kennzeichnen wir sie mit der Entity-Annotation. Ebenfalls müssen wir das Feld kennzeichnen, was als Identifier dient, das ist das Feld Id und da schreiben wir die Id-Annotation drüber. Nun geben wir noch an, wie diese Id generiert wird, das machen wir mit Hilfe der GeneratedValue-Annotation und hier geben wir als Generierungsstrategie an, dass IDENTITY benutzt wird. Das können wir machen, weil wir wissen, dass wir mit einer MySQL-Datenbank arbeiten werden. Damit ist die Klasse Address auch schon fertig und kann als Entität verwendet werden. Schauen wir uns die Klasse Customer an. Die Klasse Customer verfügt ebenfalls nicht über allzu viele Felder. Eigentlich sind es nur vier Stück, nämlich id, firstName, lastName und eine Liste der Adressen. Das Feld Id ist der Primärschlüssel, firstName, lastName entsprechen Vor- und Nachname und in der Eigenschaft Adresses werden die zugewiesenen Adressen gehalten. Damit der Customer eine Entität sein kann, benötigt er ebenfalls die entsprechende Annotation. Nun müssen wir noch das Feld Id entsprechend kennzeichnen, auch da kommt die passende Annotation drüber, nämlich die @ID-Annotation und wir verwenden die GeneratedValue- Annotation, um bekanntzugeben, wie die Werte. die in der Id gehalten werden, generiert werden, nämlich als Primärschlüssel, als Identifier aus der Datenbank. Zuletzt werden wir die Liste noch annotieren müssen. Diese Liste stellt ja eine 1:n- Beziehung zwischen Kunden und Adressen dar. Und aus diesem Grund fügen wir hier die @OneToMany-Annotation drüber ein und können nun hier weitere Attribute setzen. Das Attribut cascade mit dem Wert cascadeType.All sorgt dafür, dass alle Änderungen vom Kunden automatisch auch an die Adressen übertragen werden, bedeutet, wenn ein Kunde zum Beispiel gelöscht wird, dann werden die zugeordneten Adressen auch gelöscht. Mit dem Attribut fetch können wir das Ladeverhalten ändern, nomalerweise ist für eine Liste das Ladeverhalten LAZY-loading, dass ist allerdings nicht das, was wir brauchen, wenn wir die Daten serialisiert in irgendeiner Form zum Client schicken wollen, deswegen ändern wir jetzt hier auf FetchType.EAGER. Und zuletzt benötigen wir noch das Flag OrphanRemoval, dort setzen wir den Wert true und dieses [Flag] mit dem Wert true besagt, wenn ein Datensatz nicht mehr in dieser Liste existiert, aber noch in der Datenbank ist, dann wird er beim nächsten Speichervorgang entsprechend gelöscht. Nun haben wir auch den Kunden, also den Customer fertig implementiert und können uns nun der Geschäftslogik zu wenden. Diese Geschäftslogik ist implementiert in einer Stateless Session Bean, und zwar in der Stateless Session Bean mit dem Namen CustomerManagementBean aus dem Package de.video2brain.customers.beans. Die Stateless-Annotation gibt Auskunft darüber, dass es sich um eine EGB handelt und wir haben hier den Entity-Manager, der uns über die PersistenceContext- Annotation injiziert wird und mit dessen Hilfe wir dann auf die Datenbank zugreifen werden. In dieser Bean sind die üblichen CRUD-Operationen abgebildet. Also Create-Read-Update und Delete. Allerdings nicht in dieser Reihenfolge. Wenn wir uns die Methoden anschauen, gibt es hier zwei Methoden, die getAllCustomers heißen. Also die eine heißt direkt getAllCustomers und die andere heißt getAllCustomersFull. Die unterscheiden sich letztlich nur darin, dass die Methode getAllCustomers eine Liste vom Typ BaseCustomerData zurück gibt. Das ist das Datentransferobjekt, was wir vorhin gesehen haben, und diese Liste wird erzeugt mit Hilfe einer Select-Abfrage auf Customers und zwar verwenden wir hier eine sogenannte Constructor-Projection. Dabei wird bei jedem Durchlaufen der zurückgegebenen Customers-Liste eine neue BaseCustomerData-Instanz erzeugt und dieser werden dann die Felder des jeweiligen Kunden, also ID, Vorname und Nachname direkt in deren Constructor übergeben. Deswegen hat diese BaseCustomerData-Klasse nämlich auch den überladenen Constructor. Weniger Aufwand treiben wir dann in der Methode getAllCustomersFull. Hier werden lediglich die Kunden, so wie sie sind, zurückgegeben. Die Methode getCustomer wird uns einen einzelnen Customer zurückgeben, identifiziert über seinen Primärschlüssel. Die Methode createCustomer erzeugt einen Kunden. Also das heißt, erzeugt wird er hier nicht, sondern er wird gespeichert, er wird uns als Parameter übergeben und dann lassen wir ihn mit Hilfe der Methode persist des Entity-Managers in die Datenbank übertragen. Die Methode updateCustomer merged einen Customer. Das heißt, Aufgabe ist, dass die Daten, die übergeben werden, mit den Daten in der Datenbank abgeglichen werden und die Änderungen gespeichert werden. Das macht die Methode merge. Das Ergebnis dieser Änderung befindet sich dann in der Rückgabe, also in der Variablen result und die geben wir jetzt zurück. Und zuletzt die Methode deleteCustomer. Hier wird ein Customer identifiziert, über seinen Primärschlüssel, gelöscht. Das ist die Implementierung der Geschäftslogik, um die Daten in die Datenbank zu speichern, sie darin zu updaten oder sie aus der Datenbank wieder zurückzugeben. Um nun unser Projekt noch fertigstellen zu können, müssen wir noch dafür sorgen, dass es hier sich um ein JPA.Projekt handelt. Dies erreichen wir, falls noch nicht geschehen, indem wir einen Rechtsklick auf das Projekt ausführen und dann aus dem Reiter Properties den Bereich Project Facets auswählen. Und hier gibt es das Project Facet JPA. Das können wir auswählen und hier können wir sagen, welche JPA-Implementierung wir benutzen wollen. Wir werden hier sagen, dass die Plattform Generic ist, also einfach nur die Standardplattform ist, die eigentliche Library wird von der Target Runtime, also vom Wildlife-Server bereitgestellt. Eine Connection müssen wir hier nicht angeben. Das machen wir dann gleich von Hand und hier unten wird gesagt, dass die annotierten Klassen automatisch gefunden werden sollen. Ein Klick auf Apply sorgt dafür, dass die dafür benötigte Datei, nämlich die persistence.xml-Datei im MetaInf-Verzeichnis angelegt ist und unser Projekt ist für JPA schon fertig konfiguriert. Nun müssen wir noch zwei, drei Konfigurationen vornehmen. Das machen wir am schnellsten in der persistence.xml direkt. Und zwar müssen wir hier drin auf unsere Datenquelle verweisen, dass machen wir über die Eigenschaft jta-Data-Source. Und hier verweisen wir auf den Namen der Datenquelle im Application-Server. Auch das ist Java:jboss/datasources/customers, so wie wir das angelegt haben in der Verwaltungsoberfläche des Servers. Nun können wir noch zwei Eigenschaften setzen, dass machen wir über proberties innerhalb der persistence-unit. Und zwar setzen wir zunächst die Eigenschaft hibernate.hbm2ddl.auto mit dem Wert create. Vorsicht bei dieser Eigenschaft. Sinn und Zweck dieser Eigenschaft ist es nämlich, dass das Datenbankmodel für uns automatisch angelegt wird, wir uns also nicht darum kümmern müssen, wie Tabellenstrukturen und Ähnliches aussehen, sondern das anhand der JPA-Annotation ermittelt wird. Nur bei jedem Start der Applikation wird das alte Datenbankmodel weggeworfen. Wenn sie das nicht wollen, dann können sie den Wert auch auf update setzen oder sie nehmen diesen Schlüssel komplett raus, dann wird nämlich keine Änderung mehr vorgenommen am Datenbankmodell, wenn es einmal geschrieben ist. Und die andere Eigenschaft, die wir noch setzen können, ist hibernate.show_sql mit dem Wert true und dann wird in der Konsole ausgegeben, welche SQL-Statements vom hibernate generiert werden. Warum wir Hibernate-Eigenschaften setzen, ganz einfach. Wir verwenden Wildfly und im Wildfly ist Hibernate das Standardpersistance-Framework. Wenn sie sowas wissen, dann können sie die entsprechenden Einstellungen in der persistence.xml treffen, wird ein anderes Persistence-Framework eingesetzt, dann ignoriert es beispielsweise die Hibernate-Properties und sie können die jeweils spezifischen Einstellungen hier treffen. Damit haben wir den Data-Layer und die Entitäten fertig konfiguriert.

Java EE 7: Web Services

Steigen Sie ein in die Java-Enterprise-Welt und lernen Sie, wie Nachrichten ausgetauscht und Dienste definiert werden.

5 Std. 13 min (30 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!