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
@ f.schwarz@signsoft.com
Þ 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