DOAG Regionaltreffen Trier/Saarland Verwendung von TopLink in J2EE Applikationen 09. September 2003 Marcus Keuper, Pfeil GmbH
Übersicht Aufgabe Persistenz-Schicht TopLink als O/R-Mapper Realisierung Ausblick
Aufgabe Migration einer Client-Server- Applikation nach J2EE
Fachl. Anforderungen Ergonomisch Datenintegrität Erweiterung der Funktionalität
Techn. Anforderungen Java Applikation J2EE Thin-Client Plattformunabhängig Performant Zukunftssicher Abwärtskompatibel
J2EE Architektur Quelle: Sun
Persistenz-Schicht Eine Abstraktionsebene, welche die Details der Speicherung in einer Datenbank von Objekt- und Applikationsschicht trennt
JDBC JDBC ist kein Persistenz- Framework, aber es bietet die Möglichkeit, auf seiner Basis ein Framework zu erstellen JDBC verwendet SQL und liefert relationale „result sets“ Sehr schnell Hoher Programmieraufwand
Entity Beans Langsam Skalierbar Hohe Komplexität Aufwändig zu Warten
O/R Mapper Bester Kompromiss zwischen Nutzen und Aufwand OJB (Apache) Hibernate (Sourceforge) CoCo-Base TopLink
O/R-Mapper Bytecode-Enhancing Via Reflection Deklarativ (XML)
Vorteile eines Persistenz- Frameworks Übernimmt die Übersetzung von Datenbankobjekten in Java-Objekte Stellt eine abstrahierte Abfragesprache zur Verfügung Verwaltet Datenbankanbindungen und Transaktionen
Eigenentwicklung ? Meist Projektressourcen > 40 % Hohe Wartungskosten Fehleranfälligkeit in Applikationen Flexibilität bei Applikationsänderung
Was ist TopLink ? O/R-Mapper Deklarativer Mapper „proven industry-standard persistence framework“
Realisierung Standard-Vorgehensweise Randbedingungen Übernahme des Datenbank- Schema Beispiel
Standard-Vorgehen
Daten-Modell
Beispiel WebPSE Use-Case
Beispiel WebPSE Use-Case „Spesen erfassen“ Tabelle „Spesen“ P_ID CHAR(30) M_ID NUMBER(3) BETRAG NUMBER(19,2) DATUM DATE ZWECK VARCHAR2(2000) ZAEHLER NOT NULL NUMBER(22)
Java-Klasse public class Spesen { private double betrag; private Date datum; private BigDecimal mitarbeiterId; private String projektId; private BigDecimal spesenId; private String zweck; private Projekt projekt = null; // Rückreferenz auf Projekt public Spesen () { } getter/setter - Methoden
TopLink Workbench Klassen Tabelle Mapping-Info
TopLink Workbench
Konfiguration Möglichkeit des nativen Sequencing Lazy Initialisation via „Indirection“ Verschiedene Mappings möglich „Direct to Field“ „One to One“ „One to Many“ „Many to Many“ Implizite Typkonvertierung Und vieles mehr....
Object-Caching Standard-Verhalten Abfrage SQL-Query Ergebnis(se) Existenzprüfung mit Primary Key im Cache Ja “liefere Objekt aus Cache“ Nein Datenbank-Abfrage, „erstelle Objekt im Cache und liefere es zurück“
Caching-Strategien None Always Only if newer Version
Metadaten-Architektur Mit Hilfe der Workbench werden Metadaten im XML-Format erzeugt Mapping-Informationen sind nicht im Objekt gespeichert TopLink verändert weder das Objektmodell noch das Datenbank- Schema Schnelles Anpassen Änderungen (Datenbank)
Projekt-Deskriptor Deskriptoren
Beispiel WebPSE Import der generierten Metadaten mit Hilfe einer Java-Klasse Herstellen der Datenbankanbindung Datanbankanbindung im Kontext der Applikation Serviceorientierte Architektur Use-Cases in Struts-Actions implementiert Ergebnisse werden in FormBeans gewrappt und auf JSPs ausgegeben
Abfragen 1 public Spesen readSpesen(BigDecimal id) { Spesen spe = new Spesen(); ExpressionBuilder builder = new ExpressionBuilder(); Expression expr = builder.get("spesenId").equal(id); spe = (Spesen)session.readObject(Spesen.class,expr); return spe; } Vorteil: Kein einziges SQL-Statement nötig Kann aber bei Bedarf in der „Mapping Workbench“ konfiguriert werden Lesen aus DB/Cache
Abfragen 2 public Vector spesenAnzeigen(String projektId) { Vector vecSpesen = new Vector(); ReadAllQuery query = new ReadAllQuery(Spesen.class); ExpressionBuilder builder = new ExpressionBuilder(); Expression expr1 = builder.get("projektId").equal(projektId); Expression expr2 = builder.get("mitarbeiterId").equal(userId); Expression finalExpr = expr1.and(expr2); query.setSelectionCriteria(finalExpr); query.addAscendingOrdering("datum"); vecSpesen =(Vector)session.executeQuery(query); return vecSpesen; } Erstellen der Abfrage Sortieren
Datensicht FormBean Actions
Zusammenfassung Reduzierung des Entwicklungsaufwands Intuitive graphische Oberfläche zum Entwickeln (Mapping Workbench) 100% Pure Java Anbindung an fast jede relationale und nicht-relationale Datenbank durch passende JDBC-Treiber möglich
Alternativen Open Source OJB (Apache) Hibernate (Sourceforge) Commercial TopLink CoCo-Base
Ausblick Komplette Migration der Applikation Komplettes Abschalten der ‚alten‘ Client-Server-Applikation Zugang zur Applikation über die Firmen-Homepage
Schluss Schlechte Dokumentation/Kompatibilität Hoher Einarbeitungsaufwand Durch Migration höhere technologische Qualität Leichte Wartbarkeit Leichte Anpassung
DOAG Regionaltreffen Trier/Saarland Verwendung von TopLink in modernen J2EE Applikationen 09. September 2003 Marcus Keuper, Pfeil GmbH