Datenbankdesign und -modelierung mit dem JDeveloper Definieren einer DB Verbindung (JDBC) Um eine neue Datenbankverbindung zu definieren nutzt man entweder direkt den Connections Navigator, indem man auf dem Ordner Database mit der linken Maustaste New Database Connection… auswählt, oder man lässt sich beim Anlegen einer neuen Datenbank oder beim Import einer bestehenden Datenbank von Wizards leiten. Will man im Applications Navigator z.B. ein neues Datenbankobjekt anlegen, so wird man vom JDeveloper erst einmal in den Database Connection Wizard geleitet. In beiden Fällen wechselt man direkt hinüber zum Database Connection Wizard. 1 Nach Weiter befindet man sich schon im 1.Schritt zur Definition einer Datenbankverbindung. Hier kann dann der Verbindungsname und Typ angegeben werden. Standard im Verbindungsaufbau ist die JDBC. Nach Weiter befindet man sich im 2.Schritt, wo die Datenbankzugangsdaten angegeben werden müssen. 2 Diese Daten sollten bekannt sein, ansonsten wenden Sie sich bitte an Ihren Datenbankadministrator. Dies betrifft im übrigen auch den nächsten Schritt, in welchem die Details des Datenbankverbindungsaufbaus angegeben werden müssen. Diese Daten können, wenn sie nicht bekannt sind, auch über die Enterprise Manager Console von Oracle ermittelt werden. Im 4. und letzten Schritt kann ein Verbindungstest durchgeführt werden. 3 Sollte der Verbindungsaufbau nicht erfolgreich gewesen sein, so sollten die Daten noch einmal überprüft werden oder der Datenbankadministrator herangezogen werden. Anmerkung: Anstelle der Host, Port und Service Information kann die JDBC-URL angegeben werden. Die JDBC URL hat zu lauten: jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=dbsrv01.desy.de )(PORT=1521))(ADDRESS=(PROTOCOL = TCP)(HOST = dbsrv02.desy.de)(PORT = 1521))(ADDRESS = (PROTOCOL = TCP)(HOST = dbsrv03.desy.de)(PORT = 1521))(LOAD_BALANCE = yes)(CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = desy_db.desy.de)(FAILOVER_MODE =(TYPE = NONE)(METHOD = BASIC)(RETRIES = 180)(DELAY = 5)))) Durch die Verwendung der URL können mehrere Hosts angegeben werden, hier dbsrv01.desy.de, dbserv02.desy.de und dbserv03.desy.de. Dies ist vor allem dann von Vorteil, wenn einmal ein Service nicht zur Verfügung steht. Die Host, Port und Service-Name Informationen sind dann nicht mehr von Bedeutung, sie werden durch die URL abgedeckt. 4 Datenbankdesign Allgemein Design einer Datenbank über den Connection Navigator Eine neue Datenbank kann direkt online auf dem Server oder offline erstellt werden. Bei der Online-Variante werden die neuen Tabellen, Columns, Indizes etc. direkt erstellt, was nur im Connection-Navigator möglich ist. Um online zu arbeiten, muß eine Database Connection (JDBC) erstellt werden, welche die Datenbankverbindung aufbaut und verwaltet. (siehe oben) Diese Verbindung kann dann in ihren Details im Connection Navigator unter Database eingesehen und gegebenenfalls bearbeitet werden. Hier können neue Tabellen, Trigger, Stored Procedures, Functions etc. angelegt werden, im eingeschränkten Masse verändert oder auch gelöscht werden. Jedes dieser Datenbankobjekte wird dann anhand eines Wizards direkt erstellt, was bedeutet, dass man z.B. nicht mehreren Tabellen gleichzeitig designen kann. Somit werden bestimmte Abhängigkeiten nachträglich gesetzt werden müssen, was aber keine Einschränkung darstellt. Mit einem rechten Mausklick auf dem entsprechenden Folder kann dann ein neues Objekt erzeugt werden. Um eine neue Tabelle anzulegen, wird dann aus dem Popup new Table ausgewählt und schon befindet man sich im Create Table Wizard. 5 Im 1.Schritt werden die Grunddaten der neuen Tabelle angegeben. Das Schema kann ausgewählt werden, die Datenbank ermittelt die zur Verfügung stehenden Schemen der Datenbank. Default ist das Schema unter welchem die Datenbankverbindung definiert wurde. (Ausserhalb einer Datenbankverbindung können keine Datenbankobjekte angelegt werden.) 6 Im 2.Schritt können nun die Tabellenspalten definiert werden. Mit der Definition der Tabellenspalten ist das Grundgerüst einer Tabelle erstellt, von nun an kann die Tabelle mit Fertig stellen erstellt werden. Alle Schritte, auf die jetzt verzichtet wird, können nachdefiniert werden! Hinweis: Im Connection Navigator können angelegte Tabellen nicht beliebig verändert werden. Im Connection Navigator ist nur die Definitionserweiterung einer Tabelle erlaubt. Es können neue Columns definiert, auch ein Primary Key definiert werden, sofern sie zuvor noch nicht definiert waren. Ein „falscher“ Primary Key oder Index kann hingegen nicht gelöscht oder geändert werden. 7 Im 3. Schritt wird der Primary-Key definiert: Durch die Pfeile und Doppelpfeile kann man die gewünschten Columns zum definierten Primary-Key machen. Die Selected Columns bilden den Primary Key. Im 4.Schritt werden Eindeutigkeiten festgelegt. Das Handling ist identisch zu dem bei den Primary Keys. 8 Im 5.Schritt können die Fremdschlüssel definiert werden: In weiteren Schritten können: Schritt 6: Check Constraints, Schritt 7: Indexes und Schritt 8: Storage Options definiert werden. Übergeht man diese Schritte einfach durch das Weiter-klicken, so bekommt man am Ende das Create-Statement angezeigt, welches dann automatisch auf die Datenbank appliziert wird, wenn man Fertig stellen auslöst. Drückt man direkt Fertig stellen, so wird dieses Statement nicht mehr angezeigt, sondern die Tabelle einfach angelegt! Das Durchlaufen des Wizards hat somit den Vorteil das Create-Statement noch sichern zu können. Allerdings kann man sich jederzeit das Create-Statement auch an anderer Stelle erzeugen lassen. Anbei noch mal den finalen Schritt des Wizards. 9 Mit Fertig stellen wird die Tabelle direkt in der Datenbank erstellt. Im Connection Navigator kann man sich die neue Tabelle in der Definition der Datenbankverbindung unter dem Folder Table anzeigen lassen. Mit einem Doppelklick auf den Tabellennamen, wird im Editor Window ein neuer Tab aufgebaut. Dieser neue Tab ist in 2 Seiten aufgeteilt in welchem zum einen die Strukturdaten der Tabelle und zum anderen die gespeicherten Daten eingesehen werden können. Die Strukturdaten können in dieser Ansicht nicht manipuliert werden. Die Daten-Seite kann man nicht nur zum Ansehen der gespeicherten Daten benutzen, sondern auch zum Anlegen und Manipulieren von Daten. 10 Neue Zeilen oder Zeilen in denen ein Wert geändert wurde, werden mit einem * markiert. Hinweis: Beim Ändern von Spaltenwerten wird der * nur angezeigt, wenn man den Fokus auf eine andere Zeile lenkt. Im Data Editor im Log-Window wird das applizierte Datenbankstatement bzw. der ausgeführte Befehl dann angezeigt. Design der Datenbank über den Applications Navigator Im Applications Navigator ist der Ablauf zum Entwickeln der Datenbanktabellen ähnlich. Die Datenbank gehört zu den Sourcen einer Application somit ist sie dem Model-Layer zugehörig. Hat man noch keine Datenbankverbindung erstellt, so wird man beim Versuch neue Tabellen anzulegen von der New Gallery dazu aufgefordert. Möchte man selbst diesen Weg zuerst beschreiten, so wählt man mit der linken Maustaste auf der Applikation New aus. In der New Gallery kann man entweder über den Database Tier → Database Connection das Anlegen einer JDBC Source antriggern, oder über General → Connections → Database Connection. In beiden Fällen wird der Database Connection Wizard gestartet (siehe oben). Die JDBC-Source ist im Applications Navigator nicht sichtbar, sie ist auch keinem Projekt zugeordet, so gehören die Connections zu den Generals, sie können ausserhalb von Projekten angelegt werden. Um jetzt eine neue Tabelle anlegen zu können, wechselt man in das Model-Projekt. Mit dem rechten Mausklick auf dem Model-Folder und der Selektion von New wird die New Gallery geöffnet. In der Filter By Drop Down List Box muss All Technologies ausgewählt werden. Unter den Categories ist nun Database Tier → Offline Database Objects auszuwählen. Unter den Items kann nun Table ausgewählt werden. Sollen die neuen Tabellen gleich einem Schema zugeordnet werden, so muss zunächst ein neues Schema erstellt werden. Wird kein Schema erstellt, so gibt es das Default Schema MYSCHEMA. 11 Mit OK wird man direkt in den Create Offline Table Wizard weitergeleitet. Der Wizard unterscheidet sich vom Create Table Wizard eigentlich nicht, ausser darin, dass die generierte Tabelle nicht auf der Datenbank appliziert wird. Erstellt man hier eine Tabelle, so kann man im Applications Navigator sehen, dass ein Unterverzeichnis Offline Database Sources angelegt wurde und Model nun kursiv erscheint. Hinweis: Bei noch nicht gespeicherten Objekten wird die Veränderung im Trägerobjekt durch eine kursive Darstellung angezeigt. Wenn man seine Änderungen jetzt speichert, wird Model wieder richtig angezeigt. Im Verzeichnis Offline Database gibt es jetzt ein Unterverzeichnis für das Schema, im Defaultfall MYSCHEMA. Im Schema befindet sich nun die angelegte Tabelle. Die neu angelegte Tabelle ist im Connections Navigator noch nicht sichtbar, da es sich noch um ein Offline Database Objekt handelt. Unser Schema besteht nun aus Tabellen auf dem Server und aus lokalen offline DB Objekten. Um diese separat entwickelten Teilauszüge des Datenmodells zusammenzubringen wird nun ein Import der Database Objekte in das offline Schema durchgeführt. Mit einem rechten Mausklick auf das Schema-Verzeichnis geht ein Popup-Menue auf, aus welchem Import Database Objects auszuwählen ist. Jetzt wird der Wizard für den Import der Datenbankobjekte aufgerufen: 12 Im 1.Schritt wird die definierte JDBC-Verbindung ausgewählt. Im 2.Schritt können nun die Datenbankobjekte ausgewählt werden, die durch die DB Connection verfügbar sind. Hinweis: Das Schema in der Datenbank muß namentlich nicht mit dem offline Schema übereinstimmen. 13 Für das offline Schema können die Objekte auch unter New Name umbenannt werden. Im 3. Schritt wird nun das Schema spezifiziert. Wenn das lokale Schema einen anderen Namen hat, als das Schema der Datenbank, so muss das Schema überschrieben werden. Falls Objekte schon einmal importiert wurden, können sie an dieser Stelle überschrieben werden. 14 Im finalen Schritt wird eine Zusammenfassung der durchgeführten Schritte angezeigt. Mit Fertig stellen wird der Abgleich durchgeführt. Die zuvor noch nicht bekannten Objekte in unserem lokalen Schema werden im Schema-Verzeichnis nun kursiv angezeigt. Mit einen Doppelklick auf das Datenbankobjekt im Schema-Verzeichnis bekommt man die Properties des jeweiligen Objektes angezeigt. Diese können hier auch geändert werden: 15 Werden Datenbankobjekte durch diese Möglichkeit verändert, so muss diese Veränderung auch der Datenbank bekannt gemacht werden, indem ein Abgleich mit der richtigen Datenbank durchgeführt wird. Der Abgleich muß natürlich auch dann vollzogen werden, wenn neue Tabellen im offline Schema angelegt werden. Generate or Reconcile Objects Mit einem rechten Mausklick auf unser Schema-Verzeichnis erscheint ein Popup-Menü, aus welchem Generate or Reconcile Objects auszuwählen ist: Durch das Generate or Reconcile Objects wird ein SQL-Skript erstellt, welches die offline Veränderungen, die auf der Datenbank stattgefunden haben, dokumentiert und entsprechend in ein DDL-Statement umsetzt. Im 1. Schritt des Wizards können die Objekte ausgewählt werden, die auf die Datenbank appliziert werden sollen, unabhängig davon ob sie nur verändert oder gar neu angelegt wurden. 16 Nach Weiter erscheint ein Fenster, in welchem ausgewählt werden kann, wie das SQL-Skript aufgebaut werden soll. Durch CREATE Objects werden DDL-Statements zum Erzeugen von Tabellen und Constraints erzeugt. Dieses Statement erzeugt Fehler, wenn es die zu erzeugenden Objekte in der Datenbank schon gibt, verhindert damit auch Gleichzeitig, dass Tabellen oder Daten ungewollter Weise verloren gehen. Mit REPLACE Objects, wird das Objekt in der Datenbank gelöscht, falls es schon vorhanden sein sollte, und dann erneut erstellt. Hierbei gehen in der Datenbank befindliche Daten verloren. Mit ALTER Objects wird vom JDeveloper ein direkter Dictionaryabgleich der Datenbank durchgeführt und ein Skript erstellt, welche die notwendigen Änderungen vollzieht um einen Gleichstand zu erreichen. Hierbei wird im weiteren Verlauf zunächst eine DB Connection aufgebaut. Hierfür muß bereits eine Datenbankverbindung definiert sein. Wird wie folgt zunächst nur ein CREATE Objects ausgewählt 17 Im 3. Schritt kann ein Skript generiert werden, welches auf die Datenbank appliziert wird. Wird Generate SQL Scripts ausgewählt, so muß ein Dateiname vergeben werden unter welchem es im Projekt gespeichert wird. Jetzt kann mit Fertig stellen der Wizard beendet werden. Das Skript kann manuell appliziert werden. 18 Hinweis: Der Abgleich kann auch ohne gespeichertes Skript durchgeführt werden, es gibt dann lediglich kein DDL-SQL-Statement in Skriptform. Im 4. Schritt kann dann entschieden werden, dass das generierte Statement auf die Datenbank appliziert werden soll, hierzu muß dann allerdings die entsprechende Database Connection ausgewählt werden. Sollte keine vorhanden sein, kann über New eine Neue erstellt werden. Der Wizard leitet dann den weiteren Ablauf in den Database Connection Wizard um. (siehe oben) Nach Erstellen der Datenbankverbindung-Source (JDBC) kehrt der Database Connection Wizard in den Generate SQL from Offline Database Objects Wizard zurück. Im finalen Schritt gibt es dann noch mal eine Zusammenfassung der Entscheidungen der einzelnen Schritte. Diese Genierungsoptionen können jetzt in einer Profile Datei im Projekt gespeichert werden. 19 Mit Fertig stellen wird nun das DDL-Statement auf die Datenbank appliziert. Des weiteren gibt es, unter Umständen, 2 neue Dateien. Eine mit dem DDL-Statement und eine Profiledatei (hier profile_ring.generate) für die Generierung. Nach OK wird einem noch das generierte DDL-Statement im Source-Editor angezeigt. Interessant ist jetzt vor allem die Profile-Datei. Mit einem Doppelklick auf diese Datei bekommt man die Properties dieses Generierungslaufes. Die definierten Optionen können jetzt noch beliebig geändert werden und dann erneut oder gar zum ersten Mal auf die Datenbank appliziert werden. Auf diese Weise muß der Wizard nicht abgebrochen werden, wenn Unklarheiten auftreten. 20 Mit einem rechten Mausklick auf die Datei kann im Popup-Menü dann das Generate durchgeführt werden. Sollte das Generate mehrfach, ohne Veränderung der Profildaten, ausgeführt werden, kann es zu Fehlern führen, z.B. dann, wenn eine Tabelle angelegt werden soll, die schon existiert. Man kann die SQL Script Options der .generate auch dazu nutzen selbst erstellte Skripte in den Generate-Vorgang einzubinden. Das Database-Diagramm Wer es lieber graphisch mag… Der JDeveloper bietet noch die Möglichkeit die Datenbank graphisch zu entwickeln. Mit einem rechten Mausklick auf dem Model-Projekt-Ordner im Applications Navigator erscheint ein Popup-Menü aus welchem man New auswählt. Aus der New Gallery wählen wir die Kategorie Database Tier → Offline Database Objects. Aus den Aufgelisteten Items das Database Diagram. Beim Anlegen vergibt man zunächst einen Namen für das Diagramm und weiter ein Package. Hier kann ein beliebiger Name angegeben werden, denn wenn es das Package noch nicht gibt, dann wird es erzeugt. Man sollte jedoch versuchen seine Packages nicht allzu sehr zu streuen und sie thematisch beisammen zu halten. 21 Im Visual Editor befindet sich jetzt ein leeres Database Diagramm. Mittig findet sich ein initialisierter Kommentar: „Drag objects from the navigator here to model them. Alternatively, use the component palette to create new objects”. Um nun die bereits erstellten Tabellen auf das Diagramm zu bringen wählt man die Objekte einfach im Applications Navigator unter den Offline Database Sources aus und zieht sie per drag and drop auf das Diagramm. Hierbei werden die Relationen automatisch bildlich dargestellt. 22 Um neue Objekte im Diagramm zu platzieren verwendet man die Component Palette, indem man das gewünschte Objekt auswählt und es einfach per Mausklick im Diagramm platziert. Platziert man z.B. eine neue Tabelle, so kann der Tabellenname gleich überschrieben werden. Mit einem Doppelklick auf das neue Objekt bekommt man die Edit Offline Table Funktionalität. Hier können jetzt die einzelnen Tabelleninformationen definiert werden. Diese Ansicht ist bereits aus dem Schemaimport bekannt. Mit OK wird die Ansicht beendet, es wird folglich nicht in den nächsten Informationspfad gesprungen. Mit OK ist das Objekt noch nicht gespeichert! Im Applications Navigator wir das Objekt daher kursiv angezeigt. Erst nach dem Speichern ist das Objekt eingefügt. 23 Unter den Column Information können die neuen Columns definiert werden: Die PK-Information wird durch Selektion der Columns, die den Primary Key bilden, gesetzt: Die Selected Columns bilden hierbei den Primary Key. 24 Hinweis: Mit OK werden die bereits definierten Attribute zwar nicht richtig gespeichert, aber es verhält sich schon ein bisschen so, als wären sie gespeichert. Verlässt man die Ansicht also mit OK, so ist das Objekt kursiv, aber die Werte sind gesetzt. Verlässt man die Ansicht mit Abbrechen, egal unter welcher Informationsleiste man sich gerade befindet, so gehen alle definierten Werte verloren….zumindest all die, die noch nicht mit OK bestätigt wurden. Bei der Definition des Foreign-Key ist noch interessant, dass ein FK auch für einen ausschliesslichen offline Betrieb gesetzt werden kann. Erzeugt man sich das DDL-Skript, wobei das Offline Only- Kennzeichen gesetzt ist, so wird kein Foreign-Key-Statement generiert! 25 Im Diagramm wird die neue Tabelle entsprechend Ihrer Attribute dargestellt. Die neue Tabelle befindet sich jetzt im offline Schema, sie muß jetzt noch für die online Datenbank generiert und appliziert werden. (Siehe Generate or reconcile) Soll nach Abschluß der Entwicklungsarbeit nun ein gesamtes Diagramm, also nicht nur ein einzelnes Objekt übersetzt werden, so kann im Menü unter Model → Generate oder durch den rechten Mausklick Generate, das erstellte Diagramm auf zwei Arten übersetzt werden: 1. → Data Definition Language hiermit wird ein aktiver Ausschnitt des Diagramm, welcher zuvor mit Hilfe der Maus markiert wurde, in eine applizierbare SQL-Syntax transformiert. 2. → Data Definition Language for Diagram hiermit wird das gesamte Diagramm in eine applizierbare SQL-Syntax transformiert. 26 Im Connection Navigator kann jetzt die Datenbank betrachtet werden. Unter Database sind die definierten JDBC-Sourcen zu finden. Aufgeteilt in die unterschiedlichen Rollen der Datenbank (dies wurde in der JDBC-Source) definiert. Unter dem Verzeichnis Tables sind dann die neu angelegten Tabellen zu finden. Im Connection Navigator können die einzelnen Tabellen detailiert betrachtet werden. Es können die Columns, die Primary Keys, die Foreign Keys etc. betrachtet werden und auch definiert werden, falls noch keine existieren. Es können neue Spalten den Tabellen hinzugefügt werden, aber keine existierenden bearbeitet oder gar entfernt werden. In dieser View wird direkt auf der Datenbank gearbeitet. Um die Definitionen der Tabellen zu ändern muß also entweder über die Offline Database Sources des Application Navigators gearbeitet werden, oder direkt über SQL Plus oder die Manager Console der Datenbank. Wurden die Definitionen der Tabellen über den Connection Navigator, welches nur im sehr eingeschränken Fall möglich ist, oder über SQL Plus bewusst geändert, so kann diese Änderung schnell durch einen Datenabgleich rück-übernommen werden. Hat die Datenbank selbst einen aktuelleren Definitionsstand als unsere Offline Database Sources, so wird im Application Navigator unter Offline Database Sources das Schema herausgesucht, welches wieder aktualisiert werden soll. 27 Mit einem rechten Mausklick auf das gewünschte Schema geht ein Untermenü auf mit dessen letzten Eintrag ein Abgleich der Datenbankschemen möglich gemacht wird. Der Wizard Generate SQL from Offline Database Objects übernimmt die Navigation durch den DDL-Abgleich. 28 29 Der integrierte OC4J OC4J innerhalb des JDevelopers Der „Embedded OC4J Server“ erlaubt es Web-Applikationen innerhalb des JDevelopers zu testen. Er kann jederzeit verwendet werden, so wie wir es in einigen Beispielen bereits getan haben. Dies erlaubt schnelle und kurze Testphasen während der Entwicklung. OC4J ausserhalb des JDevelopers Um die Web-Applikation von ausserhalb der JDeveloper IDE, quasi in einer echten Serverumgebung, zu testen, kann man ebenfalls den „integrierten“ OC4J nutzen. Defacto braucht man keinen separaten Application Server zu installieren. Sollte bereits ein separater OC4J installiert sein, so braucht man diesen einfach nur zu starten. Set up OC4J 1. Teste im Browser die folgende URL: http://localhost:8888 2. Öffne die Eingabeaufforderung ( siehe: Start → Alle Programme → Zubehör) 3. Wechsel in das Verzeichnis der JDeveloper Installation cd %JDEV_HOME% Sollte die Umgebungsvariable JDEV_HOME nicht gesetzt sein, so sollte dies in der Systemsteuerung geschehen, oder manuell in das Verzeichnis der JDeveloper Installation gewechselt werden. 4. Führe das folgende Kommando aus, um auf die Javainstallation des JDevelopers zu verweisen: jdev\bin\setvars –go (benutzt Defaulteinstellung) 5. Wechsel in das folgende Verzeichnis: j2ee\home 6. Starte das Installationssetup-Skript mit java –jar oc4j.jar -install Auto-unpacking C:\JDeveloper\j2ee\home\applications\dms0.war... done. Auto-unpacking C:\JDeveloper\j2ee\home\applications\dms.war... done. Auto-unpacking C:\JDeveloper\BC4J\redist\bc4j.ear... done. Auto-unpacking C:\JDeveloper\BC4J\redist\bc4j\webapp.war... done. Auto-unpacking C:\JDeveloper\BC4J\redist\bc4j\cabo.war... done. Auto-deploying bc4j (New server version detected)... Auto-unpacking C:\JDeveloper\soap\webapps\soap.ear... done. Auto-unpacking C:\JDeveloper\soap\webapps\soap\soap.war... done. Auto-deploying soap (New server version detected)... Enter an admin password to use: manager Confirm admin password: manager Installation done 7. Starte den OC4J Server start java –jar oc4j.jar In einem separaten Fenster wird die Initialisierung mit einer Erfolgsmeldung 30 angezeigt. 8. Öffne einen Browser und gebe folgende URL ein: http://localhost:8888 Diesmal sollte keine Fehlermeldung mehr erscheinen, sondern die Defaultseite angezeigt werden. Jetzt ist der OC4J Server ausserhalb der JDeveloper IDE zugänglich. 9. Um den OC4J wieder zu beenden muß folgender Befehl ausgeführt werden: java -jar admin.jar ormi://localhost admin <admin_password> -shutdown 31