Persistenz JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 1 Objektpersistenz Abbilden von Objekten in relationale Datenbanken Auslesen und Aufbau von Objekten Speichern von Änderungen als Datenbankupdates Transaktionen JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 2 Datenbankstruktur (1/ 5) Beispiel-Objektstruktur JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 3 Datenbankstruktur (2/5) Konkrete Klasse = Tabelle Für jede konkrete Klasse gibt es eine eigene Tabelle einfache Struktur, klare Abbildung Zugriffe über mehrere Tabellen notwendig (union) Z.B. beim Zugriff auf die Räume eines bestimmten Gebäudes JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 4 Datenbankstruktur (3/5) Klasse = Tabelle auch abstrakte Basisklassen werden mit eigener Tabelle dargestellt Information über mehrere Tabellen verteilt Zusammenhang über ids JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 5 Datenbankstruktur (4/5) Vererbungshierarchie = Tabelle Für eine Vererbungshierarchie werden alle Objekte in eine Tabelle aufgenommen Diese Tabelle hat alle Attribute aller Klassen der Vererbungshierarchie plus Diskriminator, der die Klasse angibt. mehrere Tabellen für verschiedene Vererbungshierarchien günstig bei Zugriff auf unterschiedliche Objekte in einer Vererbungshierarchie z.B. Menge der Räume eines Gebäudes, die Hoersaal oder Buero sein kann JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 6 Datenbankstruktur (5/5) Tabelle = Universell eine Tabelle für alle Objekte eine Tabelle für alle Attribute flexibel aber Objektstruktur geht Von Java EE Persistence API: JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 7 Definition der OR Mapping Definition der Abbildung der Objekte auf Tabellen • Objekte in welche Tabellen • Felder in welche Spalten Von Java EE Persistence API: verwendet Annotations Möglichkeiten: • Konfigurationsfiles (XML) • Annotationen • Namensgleichheit zwischen - Klassen - Tabellen und - Felder (Properties) - Spalten JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 8 Updates Beim Ändern von Eigenschaften eines Objekts, muss das Schreiben in die Datenbank veranlasst werden Fragen: 1. wie erkennt man eine Änderung? 2. wann wird der Update in der Datenbank durchgeführt? Antworten: 1. Ändern nur über setter-Methoden, die diese Änderung melden (dirty-Flag) 2. entweder immer sofort, oder in einer Art begin- und end-update geklammert durch in einer Transaktion JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 9 Management Es muss einen zentralen Manager geben, der • • • • • die Connection öffnet Connection schließt Updates durchführt Transaktionen managed … Dieses sollte auch als Container verwendet werden • Erzeugen von Objekten • Auslesen von Objekten über eindeutigen Primärschlüssel wenn bereits geladen, das Objekt liefert und, wenn nicht, es aus der DB holt) • Löschen von Objekten • Update von Objekten • … JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 10 Management von Java EE Persistence API JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 11 Architektur GraphicObject-PersistenceLayer (1/ 5) Tabelle für GraphicObjects +‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+ | GraphObject |<‐elems‐‐‐‐‐‐‐‐‐‐+ +‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+ * | | int id, x, y | | +‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+ | /_\ | | | +‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐‐+ | | | | 1 | parent +‐‐‐‐‐‐‐‐‐‐‐‐‐+ +‐‐‐‐‐‐‐‐‐‐‐‐‐+ +‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+ | Circle | | Rectangle | | GraphComposite | +‐‐‐‐‐‐‐‐‐‐‐‐‐+ +‐‐‐‐‐‐‐‐‐‐‐‐‐+ +‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+ | int r | | int w, h | | GraphObject[] elems| +‐‐‐‐‐‐‐‐‐‐‐‐‐+ +‐‐‐‐‐‐‐‐‐‐‐‐‐+ +‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+ COLUMN_NAME |TYPE_NAME|DEC&|NUM&|COLUM&|COLUMN_DEF|CHAR_OCTE&|IS_NULL& ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ID |INTEGER |0 |10 |10 |NULL |NULL |NO DISCR |VARCHAR |NULL|NULL|128 |NULL |256 |YES X |INTEGER |0 |10 |10 |NULL |NULL |YES Y |INTEGER |0 |10 |10 |NULL |NULL |YES W |INTEGER |0 |10 |10 |NULL |NULL |YES H |INTEGER |0 |10 |10 |NULL |NULL |YES R |INTEGER |0 |10 |10 |NULL |NULL |YES PARENTID |INTEGER |0 |10 |10 |NULL |NULL |YES JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 12 Architektur GraphicObject-PersistenceLayer (2/ 5) GraphicObjects • eindeutige id für Datenbankzugriff public abstract class GraphicObject { private int id; public int getId() { return id; } • Konstruktorschnittstellte mit id (muss über Reflection aufgerufen werden) public GraphicObject(int id) { this(id, 0, 0); … }… } • Ändern von Properties nur über Setter mit Melden der Änderung für späteren DB-Update public void setX(int x) { this.x = x; PersistenceManager.getManager().markDirty(this, …); }… JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 13 Architektur GraphicObject-PersistenceLayer (3/ 5) PersistenceManager • gemanagte Objekte brauchen Zugriff Î hier Singleton public class PersistenceManager { private static PersistenceManager PMANAGER = new PersistenceManager(); public static PersistenceManager getManager() { return PMANAGER; } • Open/Close Connection private Connection conn; public void init(String url) { this.url = url; } public void openConnection() { try { conn = DriverManager.getConnection("jdbc:derby:C:/Derby/…"); } catch (SQLException e) { … } } public void closeConnection() { … } JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 14 Architektur GraphicObject-PersistenceLayer (4/ 5) • Zugriff auf Objekte mit bestimmtem Id - aus Repository von geladenen Objekten private Map<Integer, GraphicObject> objectRepository = new HashMap<Integer, GraphicObject>(); - bzw. Laden aus der DB public GraphicObject getObject(int id) { if (objectRepository.containsKey(id)) { return objectRepository.get(id); } else { try { Statement stmt = conn.createStatement(); ResultSet r = stmt.executeQuery("select … id=" + id); … } catch (SQLException e) { … } } JOHANNES KEPLER UNIVERSITY LINZ Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 15 Architektur GraphicObject-PersistenceLayer (5/ 5) • Speichern von neuen und geänderten Objekten - Neue und geänderte Objekte merken public void markNew(GraphicObject go) { … // go als neues Objekt vermerken } Eventuell genaue Information was sich geändert hat! public void markDirty(GraphicObject go, … ) { … // go geändert vermerken } - Änderungen in die DB schreiben (wird an geeigneter Stelle aufgerufen) public void updateDB() { String sql = ""; Statement stmt = null; try { stmt = conn.createStatement(); … sql = createInsertStatment(go); … // in DB schreiben … sql = createUpdateStatement(go, …); … } catch (SQLException e) { … } JOHANNES KEPLER UNIVERSITY LINZ } Research and teaching network Pratikum SWE 2 © M. Löberbauer, T. Kotzmann, H. Prähofer 16