Java Data Objects SIG Development Java Persistenz-Frameworks Frank Schwarz Professional Services Signsoft GmbH Leipziger Str. 118 01127 Dresden +49 (0)351 894 53-0 ¬ +49 (0)351 894 53-29 @ [email protected] Þ www.signsoft.de 1 Übersicht Vorstellung des JDO-Gedankens Merkmale und Ziele von JDO Konzepte des JDO-APIs Der JDO Build-Prozess Einsatzmöglichkeiten für JDO Demonstrationsbeispiel Mappingbeschreibungen Primärschlüsselklassen JDOQL-Query-Möglichkeiten Ausblick auf JDO 2.0 Frank Schwarz: Java Data Objects. DOAG-Tag 2005 (Mannheim) 2 Standardisierungshistorie JDO ist hervorgegangen aus dem Java Community Process als Java Specification Request JSR 12. Mai 1999 JDO call for experts April 2002 1.0 final release Mai 2003 JDO 1.0.1 maintanance release Fehlerkorrekturen und Klarstellungen derzeit gültige Version Aug 2005 JDO 2.0 proposed final draft (JSR 243) Standardisierung einer Vielzahl von herstellerspezifischen Erweiterungen Konvergenz mit EJB 3.0 Persistence (JSR 220) Frank Schwarz: Java Data Objects. DOAG-Tag 2005 (Mannheim) 3 Merkmale und Ziele von JDO JDBC RDBMS JDO Impl. Vendor 1 JAXP Anwendung mit Datenobjekten JDO Impl. Vendor 1 XMLFile JDO Impl. Vendor X XYZ Ziel: transparente Persistenz für Java-Objekte JDO API OODBMS XMLDB Anwender Frank Schwarz: Java Data Objects. DOAG-Tag 2005 (Mannheim) Persistenzprovider ? Datenspeicher 4 Merkmale und Ziele von JDO Minimum zusätzlicher Unannehmlichkeiten für den Entwickler (transparent persistence) Komfortables Mapping von Java-Objekten und Objektgraphen auf beliebige Datenspeicher ohne CodeÄnderungen Persistenz durch Erreichbarkeit (persistence by reachability) mit "intelligenten" Vorgabewerten Transaktionskontrolle auf Objektebene Datenbank-unabhängige Abfragemöglichkeiten mit Hilfe von Java-eigenen Konzepten (Klassen, Attribute/Assoziationen, Vererbungsbeziehungen, Operatoren) Frank Schwarz: Java Data Objects. DOAG-Tag 2005 (Mannheim) Mängel bestehender Alternativen zu JDO Lösungen auf der Basis von reinem SQL leiden unter entscheidenden Nachteilen: Nicht-transparente Code-Änderungen bei Änderung des Objektmodells Eigenentwicklungen notwendig für Caching, Objekt-Laden und ObjektSpeichern (Æ Performance?) Komplexe Implementierungen der Transaktionskontrolle Relationen-zentrierte Sicht bei Abfragen Schwierigkeiten, Vererbungshierarchien und Interfaces zu berücksichtigen Hohe Datenbank-Anhängigkeit, mangelnde Portabilität Lösungen auf der Basis früherer Versionen von Enterprise Java Beans waren ebenfalls problematisch: Performance-Probleme mit feingliedrigen Entity Beans Unmöglichkeit, auf normale Vererbungsmechanismen zurückzugreifen Schwierigkeit, Beziehungen zwischen Objekten zu erfassen Einschränkungen in der Suchen nach Datenobjekten Frank Schwarz: Java Data Objects. DOAG-Tag 2005 (Mannheim) 6 JDO Konzepte .makePersistent(Object pc) .getObjectById(…) .deletePersistentAll(Coll c) Persistence Manager Factory .getPersistenceManager() Persistence Manager Persistence Capable Object JDOHelper .getPersistenceManagerFactory (Properties prop) Frank Schwarz: Java Data Objects. DOAG-Tag 2005 (Mannheim) Transaction .begin() .commit() .rollback() Query .execute() JDO Konzepte I javax.jdo.JDOHelper Startkonfiguration der PersistenceManagerFactory Liefert PersistenceManager-Instanzen Stellt diverse Hilfs- und Abfragefunktionen zur Verfügung (z.B. isDirty(Object pc), …) javax.jdo.PersistenceManagerFactory Zentrale Konfigurationsstelle der JDO-Implementierung Liefert Instanzen des PersistenceManagers Pooling von Datenbankverbindungen und PersistenceManagers javax.jdo.PersistenceManager Operationen auf persistierbaren Objekten (makePersistent, …) Transaction-Handling Cache-Management Query and JDO Identitäts-Management Frank Schwarz: Java Data Objects. DOAG-Tag 2005 (Mannheim) 8 JDO Konzepte II javax.jdo.Transaction Transaktionskontrolle: begin / commit / rollback / isActive javax.jdo.Query Ausführung von JDOQL Abfragen Abfragen und Filter können mit Hilfe von Java Sprachmitteln definiert werden: Java-Datentypen, Klassen, Klassenattribute Persistierbare Objekte (persistence capable objects) besitzen eine eindeutige Objektidentität unter Kontrolle des PersistenceManagers (application, datastore oder nondurable) unterliegen dem JDO Lebenszyklus können die Schnittstelle InstanceCallbacks implementieren Persistenz-klare Objekte (persistence aware objects) Objekte, die im Enhancement-Prozess geändert werden müssen, ohne selbst persistierbar zu sein Frank Schwarz: Java Data Objects. DOAG-Tag 2005 (Mannheim) 9 Einsatzmöglichkeiten für JDO Stand-alone (J2SE) Persistierung von einzelnen Objekten bis hin zu ganzen Objektgraphen Æ Persistence by Reachability Einfache Austauschbarkeit der JDO-Implementierung Managed-Environment (J2EE) JDO als Implementierung von Container Managed Persistence Implementierung von Bean Managed Persistence EntityBeans dienen als Wrapper für JDO-Klassen. Nutzung von JDO innerhalb von Sessions / SessionBeans zur Bereitstellung der benötigten Daten EntityBeans sind bei diesem Ansatz entbehrlich. Die JDO-Implementierung wird typischerweise über einen JCA- Adapter eingebunden, so dass der Application Server das Transaktionsmanagement übernehmen kann. Frank Schwarz: Java Data Objects. DOAG-Tag 2005 (Mannheim) 10 JDO Build-Prozess normaler Java Build-Prozess (erster Schritt) Java Source Code Java Compiler Java Byte Code Person.class Person.java JDO Enhancement (zweiter Schritt) JDO Mapping JDO Enhancer Java Enhanced Byte Code Person.class Person.jdo Frank Schwarz: Java Data Objects. DOAG-Tag 2005 (Mannheim) 11 Beispiel – Diskursbereich als KSD Address # street: String # city: String 1 BusinessPartner # name: String Customer # creditLimit: double Frank Schwarz: Java Data Objects. DOAG-Tag 2005 (Mannheim) * Invoice # number: int # total: double 12 Java-Klassen des Diskursbereiches package bo; public class BusinessPartner { private String name; private Address address; public void setName(String name) { this.name = name; } public void setAddress(Address address) { this.address = address; } // setter methods // … package bo; public class Customer extends BusinessPartner { private double creditLimit; private List invoices = new ArrayList(); public void setInvoices(List invoices) { this.invoices = invoices; } public List getInvoices() { return this. invoices; } // … BusinessPartner.java Frank Schwarz: Java Data Objects. DOAG-Tag 2005 (Mannheim) Customer.java 13 Primärschlüsselklassen package bo; public class Invoice { private int number; private double total; private Customer customer; package bo; public class InvoiceNumber implements Serializable { public int number; public void setNumber(int number) { this.number = number; } public int getNumber() { return this.number; } // other methods // … Invoice.java Frank Schwarz: Java Data Objects. DOAG-Tag 2005 (Mannheim) public InvoiceNumber () { } public InvoiceNumber (String number) { this.number = Integer.parseInt(number); } public String toString() { return Integer.toString(number); } // Überschreiben von equals(Object o) // und hashCode() InvoiceNumber.java 14 Mapping-Beschreibung I <?xml version="1.0" enc…?> <!DOCTYPE jdo SYSTEM "jdo.dtd"> <jdo> <package name="bo"> <class name="Address" /> </package></jdo> <?xml version="1.0" enc…?> <!DOCTYPE jdo SYSTEM "jdo.dtd"> <jdo> <package name="bo"> <class name="BusinessPartner" /> </package></jdo> Address.jdo BusinessPartner.jdo <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE jdo SYSTEM "jdo.dtd"> <jdo> <package name="bo"> <class name="Invoice" identity-type="application" objectid-class="bo.InvoiceNumber"> <field name="number" primary-key="true" /> </class></package></jdo> Invoice.jdo Frank Schwarz: Java Data Objects. DOAG-Tag 2005 (Mannheim) 15 Mapping-Beschreibung II <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE jdo SYSTEM "jdo.dtd"> <jdo> <package name="bo"> <class name="Customer" persistence-capable-superclass="bo.BusinessPartner"> <field name="invoices"> <collection element-type="bo.Invoice"/> </field> </class> </package> </jdo> Customer.jdo Frank Schwarz: Java Data Objects. DOAG-Tag 2005 (Mannheim) 16 Initialisierung der PersistenceManagerFactory Möglichkeiten der Initialisierung Setter-Methoden an der PersistenceManagerFactory pmf.setConnectionDriverName(); pmf.setConnectionURL() … Laden einer Properties-Datei: InputStream propertyStream = this.getClass().getResourceAsStream("jdo.properties"); Properties jdoproperties = new Properties(); jdoproperties.load(propertyStream); pmf = JDOHelper.getPersistenceManagerFactory(jdoproperties); Über externe Ressource (herstellerspezifisch bzw. JDO2) Frank Schwarz: Java Data Objects. DOAG-Tag 2005 (Mannheim) 17 Persistierung von Objekten PersistenceManager pm = pmf.getPersistenceManager(); pm.currentTransaction().begin(); Customer c = new Customer(); c.setName("Clara Stein"); c.setCreditLimit(1000); pm.makePersistent(c); Transaktion Address a = new Address(); a.setStreet("Lange Gasse 27"); a.setCity("Dresden"); c.setAddress(a); pm.currentTransaction().commit(); pm.close(); Frank Schwarz: Java Data Objects. DOAG-Tag 2005 (Mannheim) 18 Abfrage von Objekten Abfrage über Objekt-ID Invoice inv = (Invoice)pm.getObjectById(new InvoiceNumber("1234")); Iteration über dem Extent einer Klasse Iterator i = pm.getExtent(Address.class, true); while (i.hasNext()) { Address a = (Address)i.next(); } Abfrage mit Filter (JDOQL) Query q = pm.newQuery(Customer.class); q.setFilter ("address.city==\"Dresden\" && (names.contains(name)) && (invoices.contains(i) & i.total > 1000)"); List names = Arrays.asList(new String[] {"Mayer", "Maier", "Meier"}); q.declareParameters("Collection names"); q.declareVariables("Invoice i"); Collection c = (Collection)q.execute(names); Frank Schwarz: Java Data Objects. DOAG-Tag 2005 (Mannheim) 19 Ausblick auf JDO 2 Anwendungen für JDO 1 können ohne Änderungen auf JDO 2 umgestellt werden JDO 2 greift viele herstellerspezifische Erweiterungen auf und führt diese dem Standard zu explizite Mapping-Angaben zu Tabellen- und Spaltennamen explizite Mapping-Strategie für Objekte in Vererbungshierarchien Multi-Tabellen-Objekte Verbesserung innerhalb von Mehrschicht-Architekturen Attach / Detach-Mechanismen zur Ein- und Auskopplung von persistierten Objekten Æ Weitergabe an andere Schichten Erweiterungen der Abfragesprache Projektionen, Aggregationen, Stringausdrücke 2nd Level Cache Management, … Frank Schwarz: Java Data Objects. DOAG-Tag 2005 (Mannheim) 20