25
Dessì Massimiliano Dessì Massimiliano [email protected] [email protected] Jug meeting 30-10-04 Jug meeting 30-10-04

Jug 30 10 04 Jdo

Embed Size (px)

DESCRIPTION

JDO Meeting JugSardegna 30 10 2004

Citation preview

Page 1: Jug 30 10 04 Jdo

Dessì MassimilianoDessì Massimiliano

[email protected]@yahoo.it

Jug meeting 30-10-04Jug meeting 30-10-04

Page 2: Jug 30 10 04 Jdo

Quando aiutano i JDO ?Quando aiutano i JDO ? Permettono la persistenza “ad oggetti”,“mascherando” Permettono la persistenza “ad oggetti”,“mascherando”

il gap esistente tra un database relazionale e il il gap esistente tra un database relazionale e il linguaggio ad oggetti usato nelle applicazioni java.linguaggio ad oggetti usato nelle applicazioni java.

Adatti quando il dominio degli oggetti prevede un Adatti quando il dominio degli oggetti prevede un flusso load/edit/storeflusso load/edit/store

Adatti quando esiste un sufficiente mappaggio Adatti quando esiste un sufficiente mappaggio “naturale” tra il dominio degli oggetti e le tabelle“naturale” tra il dominio degli oggetti e le tabelle

Quando gli oggetti possono essere acquisiti in grande Quando gli oggetti possono essere acquisiti in grande numero, ma aggiornati o cancellati individualmentenumero, ma aggiornati o cancellati individualmente

Page 3: Jug 30 10 04 Jdo

Con JDO si intende uno standard per la persistenza Con JDO si intende uno standard per la persistenza di oggetti java, utilizzabile su tutti gli ambienti java di oggetti java, utilizzabile su tutti gli ambienti java (da J2ME a J2EE ).(da J2ME a J2EE ).

I JDO non fanno parte della J2EE ma sono I JDO non fanno parte della J2EE ma sono integrabili con essa, si occupano soltanto del integrabili con essa, si occupano soltanto del concetto di persistenza.concetto di persistenza.

Oggetti locali. Oggetti locali.

Persistenza ricca di funzionalità. Persistenza ricca di funzionalità.

Page 4: Jug 30 10 04 Jdo

Sviluppo semplificato, contenuto informativo dei Sviluppo semplificato, contenuto informativo dei descrittori di persistenza (metadati) ridotto. descrittori di persistenza (metadati) ridotto.

Trasparenza assoluta dello strato di persistenza. Trasparenza assoluta dello strato di persistenza.

Possibilità di utilizzo con tutte le piattaforme JAVA, Possibilità di utilizzo con tutte le piattaforme JAVA, dalla semplice JVM ai container J2EE (le specifiche dalla semplice JVM ai container J2EE (le specifiche

parlano di ambienti managed e non).parlano di ambienti managed e non).

Page 5: Jug 30 10 04 Jdo

Quando si parla di trasparenza dello strato di Quando si parla di trasparenza dello strato di persistenza dei JDO, l’obiettivo è quello di permetterepersistenza dei JDO, l’obiettivo è quello di permettereal programmatore di concentrarsi sulla logica dial programmatore di concentrarsi sulla logica dibusiness, senza dover manualmente aggiungerebusiness, senza dover manualmente aggiungerenessuna istruzione di persistenza nelle classi chenessuna istruzione di persistenza nelle classi chemodellano i business object. Questo codice può esseremodellano i business object. Questo codice può essereaggiunto alla classe con differenti modalità, cheaggiunto alla classe con differenti modalità, chetroviamo nelle specifiche e che possiamo riassumeretroviamo nelle specifiche e che possiamo riassumerecon: prima della compilazione, dopo la compilazione,con: prima della compilazione, dopo la compilazione,direttamente nel codice (in questo caso senza ladirettamente nel codice (in questo caso senza latrasparenza).trasparenza).

Page 6: Jug 30 10 04 Jdo

Finora quasi tutti i produttori utilizzano la seconda Finora quasi tutti i produttori utilizzano la seconda

soluzione, con un tool chiamato enhancer, che modificasoluzione, con un tool chiamato enhancer, che modifica

(anzi, sostituisce) la classe originaria con una capace di(anzi, sostituisce) la classe originaria con una capace di

persistere (eccetto Xorm).persistere (eccetto Xorm).

Page 7: Jug 30 10 04 Jdo

L’enhancer, ed il codice aggiunto alla classe sono L’enhancer, ed il codice aggiunto alla classe sono diversi per ciascuna implementazione, ma tuttidiversi per ciascuna implementazione, ma tutticompatibili, dato che un requisito fissato dalle compatibili, dato che un requisito fissato dalle specifiche è la compatibilità binaria tra le classispecifiche è la compatibilità binaria tra le classi““enhanced” dalle diverse implementazioni JDO.enhanced” dalle diverse implementazioni JDO.

Il programmatore si occupa di scrivere il codice diIl programmatore si occupa di scrivere il codice dipersistenza, per i JDO le specifiche propongonopersistenza, per i JDO le specifiche propongonoun enhancer.un enhancer.

Page 8: Jug 30 10 04 Jdo

Esempio pratico (Xorm):Esempio pratico (Xorm):database contenete DVDdatabase contenete DVD

Page 9: Jug 30 10 04 Jdo

db.propertiesdb.properties

javax.JDO.PersistenceManagerFactoryClass=javax.JDO.PersistenceManagerFactoryClass= org.xorm.InterfaceManagerFactoryorg.xorm.InterfaceManagerFactory

javax.JDO.option.ConnectionUserName=postgresjavax.JDO.option.ConnectionUserName=postgresjavax.JDO.option.ConnectionPassword=postgresjavax.JDO.option.ConnectionPassword=postgres

javax.JDO.option.ConnectionURL=javax.JDO.option.ConnectionURL= jdbc:postgresql://localhost:5432/miodbjdbc:postgresql://localhost:5432/miodb

javax.JDO.option.ConnectionDriverName=org.postgresql.Driverjavax.JDO.option.ConnectionDriverName=org.postgresql.Driverjavax.JDO.MinPool=2javax.JDO.MinPool=2javax.JDO.MaxPool=5javax.JDO.MaxPool=5

Page 10: Jug 30 10 04 Jdo

<?xml version="1.0" encoding="UTF-8"?><?xml version="1.0" encoding="UTF-8"?><!DOCTYPE database SYSTEM "database.dtd"><!DOCTYPE database SYSTEM "database.dtd"><database><database>

<table name="dvd"><table name="dvd"> <column name="titolo" type="varchar" /><column name="titolo" type="varchar" /> <column name="prezzo" type="integer" /><column name="prezzo" type="integer" /> <column name="id" type="integer" primary- <column name="id" type="integer" primary-

key="true" auto="true" non-null="true" /> key="true" auto="true" non-null="true" /></table></table>

</database></database>

jdo.xml jdo.xml generato da Xormgenerato da Xorm

Page 11: Jug 30 10 04 Jdo

db.jdo generato da Xormdb.jdo generato da Xorm<?xml version="1.0" encoding="UTF-8"?><?xml version="1.0" encoding="UTF-8"?><!DOCTYPE jdo SYSTEM "jdo.dtd"><!DOCTYPE jdo SYSTEM "jdo.dtd"><jdo><jdo> <package name=“org.casamia.catalogo.jdo.db"><package name=“org.casamia.catalogo.jdo.db"> <class name="Dvd"><class name="Dvd"> <extension vendor-name="XORM" key="table" <extension vendor-name="XORM" key="table"

value="dvd" />value="dvd" /> <field name="titolo"><field name="titolo"> <extension vendor-name="XORM" key="column" <extension vendor-name="XORM" key="column"

value="titolo" />value="titolo" /> </field></field> <field name="prezzo"><field name="prezzo"> <extension vendor-name="XORM" key="column" <extension vendor-name="XORM" key="column"

value="prezzo" />value="prezzo" /> </field></field> </class></class> </package></package></jdo></jdo>

Page 12: Jug 30 10 04 Jdo

Interfaccia generata da XormInterfaccia generata da Xorm

public interface Dvd { public interface Dvd {

String getTitolo(); String getTitolo(); void setTitolo(String val); void setTitolo(String val);

int getPrezzo(); int getPrezzo(); void setPrezzo(int prezzo); void setPrezzo(int prezzo);

}}

Page 13: Jug 30 10 04 Jdo

Value ObjectValue Objectpublic class DvdVO implements Dvd, Serializable { public class DvdVO implements Dvd, Serializable {

public DvdVO() {}public DvdVO() {}

public void setTitolo(String titolo) { public void setTitolo(String titolo) { _titolo = titolo; _titolo = titolo;

}}

public String getTitolo() { public String getTitolo() { return _titolo; return _titolo;

} }

public void setPrezzo(int prezzo) { public void setPrezzo(int prezzo) { _prezzo = prezzo; _prezzo = prezzo;

} }

public int getPrezzo() { public int getPrezzo() { return _prezzo; return _prezzo; }}

private String _titolo; private String _titolo; private int _prezzo;private int _prezzo;

}}

Page 14: Jug 30 10 04 Jdo

package org.casamia.catalogo.jdo;package org.casamia.catalogo.jdo;

import org.casamia.catalogo.jdo.db.*;import org.casamia.catalogo.jdo.db.*;import java.io.*;import java.io.*;import java.util.*;import java.util.*;import javax.jdo.*;import javax.jdo.*;import org.xorm.*;import org.xorm.*;

public class CatalogoJdo {public class CatalogoJdo {

public CatalogoJdo() { }public CatalogoJdo() { }

public static void main(String[] args) {public static void main(String[] args) {

CatalogoJdo catalogo = new CatalogoJdo();CatalogoJdo catalogo = new CatalogoJdo(); Collection lista = catalogo.getLista("Dvd", "titolo");Collection lista = catalogo.getLista("Dvd", "titolo"); Iterator iter = lista.iterator();Iterator iter = lista.iterator(); while (iter.hasNext()) {while (iter.hasNext()) { Dvd item = (Dvd) iter.next();Dvd item = (Dvd) iter.next(); System.out.println("prezzo dvd " + item.getPrezzo());System.out.println("prezzo dvd " + item.getPrezzo()); System.out.println("titolo dvd " + item.getTitolo());System.out.println("titolo dvd " + item.getTitolo()); }} }}

Page 15: Jug 30 10 04 Jdo

public Collection getLista(String media, String elementOrder) {public Collection getLista(String media, String elementOrder) {

Collection result = null;Collection result = null; try {try { InputStream in = this.getClass().getResourceAsStreamInputStream in = this.getClass().getResourceAsStream

("db.properties");("db.properties"); PersistenceManagerFactory factory = PersistenceManagerFactory factory =

XORM.newPersistenceManagerFactory(in);XORM.newPersistenceManagerFactory(in);

PersistenceManager pm = PersistenceManager pm = factory.getPersistenceManager();factory.getPersistenceManager();

_extent = pm.getExtent(Dvd.class, true);_extent = pm.getExtent(Dvd.class, true); Query query = pm.newQuery(extent);Query query = pm.newQuery(extent); query.setOrdering(elementOrder+".ascending");query.setOrdering(elementOrder+".ascending");

result = (Collection) query.execute();result = (Collection) query.execute();

} catch (Exception ex) {} catch (Exception ex) { …… …….. … …. .

Page 16: Jug 30 10 04 Jdo

JDOQLJDOQL Java programming language syntaxJava programming language syntax JDOQL is data-store independentJDOQL is data-store independent JDO removes SQL dependencies for querying JDO removes SQL dependencies for querying

persistent datapersistent data Efficient architecture (no instantiation)Efficient architecture (no instantiation) Query instances created by PersistenceManagerQuery instances created by PersistenceManager Application must provideApplication must provide

• Candidate collection (extent, previous query)Candidate collection (extent, previous query)• Class of resultClass of result• Variable declaration, parameter declarations, Variable declaration, parameter declarations,

filter expression, import declarations, ordering filter expression, import declarations, ordering declarationsdeclarations

Page 17: Jug 30 10 04 Jdo

Extent dvds = pm.getExtent(DVD.class, true);Extent dvds = pm.getExtent(DVD.class, true);

String filter = “prezzo > 30”;String filter = “prezzo > 30”;

Query q = pm.newQuery(Query q = pm.newQuery(elementOrderelementOrder, filter);, filter);

q.setOrdering(“descending”);q.setOrdering(“descending”);

Collection results = (Collection) q.execute();Collection results = (Collection) q.execute();

JDOQL (1)JDOQL (1)

Page 18: Jug 30 10 04 Jdo

JDOQL (2)JDOQL (2)String params = “float min, float max”;String params = “float min, float max”;

String filter = ”dvd.prezzo > min”String filter = ”dvd.prezzo > min” + “ && dvd.prezzo <= max";+ “ && dvd.prezzo <= max";

Query q = pm.newQuery (Employee.class, filter);Query q = pm.newQuery (Employee.class, filter);

q.declareParameters (params);q.declareParameters (params);

Collection Collection resultsresults = (Collection) q.execute = (Collection) q.execute (new Float (20.5F), new Float (39.30F));(new Float (20.5F), new Float (39.30F));

Page 19: Jug 30 10 04 Jdo

PersistenceManagerFactory factory = PersistenceManagerFactory factory =

XORM.newPersistenceManagerFactory(in);XORM.newPersistenceManagerFactory(in);

PersistenceManager pm = PersistenceManager pm = factory.getPersistenceManager();factory.getPersistenceManager();

DVD matrix = new DVD(“Matrix revolution”, “27”);DVD matrix = new DVD(“Matrix revolution”, “27”); pm.currentTransaction().begin();pm.currentTransaction().begin(); pm.makePersistent (emp);pm.makePersistent (emp); pm.currentTransaction ().commit ();pm.currentTransaction ().commit (); pm.close ();pm.close (); pmf.close ();pmf.close ();

salvataggiosalvataggio

Page 20: Jug 30 10 04 Jdo

YesYesNoNoNoNoObject model Object model supported in queriessupported in queries

JDOQL, standard JDOQL, standard language, Java-like language, Java-like syntaxsyntax

SQL, each vendor SQL, each vendor has a different has a different dialect (not dialect (not portable).portable).

NoneNoneQuery LanguageQuery LanguageYesYesYesYesNoNoConcurrencyConcurrencyYesYesYesYesNoNoTransactionsTransactions

YesYesNoNoNoNoAutomatic Automatic management of cachemanagement of cache

YesYesNoNoYesYesSupport of references Support of references and collectionsand collections

YesYesNoNoYesYesSupport of inheritance Support of inheritance and polymorphismand polymorphism

Object / Fetch Object / Fetch GroupGroup

Table cellTable cellObject GraphObject GraphAccess granularityAccess granularity

YesYesNoNoYesYesSupport of Java Support of Java ClassesClasses

JavaJavaRelational table Relational table modelmodel

JavaJavaData ModelData Model

JDOJDOJDBCJDBCSerializationSerializationFeatureFeature

Page 21: Jug 30 10 04 Jdo

JDOJDO JDO is object-orientedJDO is object-oriented

InheritanceInheritance

PolymorphismPolymorphism

EncapsulationEncapsulation Easy to test, develop Easy to test, develop

and deployand deploy Highly flexibleHighly flexible Java-centricJava-centric

Entity BeansEntity Beans Component-orientedComponent-oriented

InheritanceInheritancePolymorphismPolymorphismEncapsulationEncapsulation

Couples persistence Couples persistence to tx and security to tx and security

Slow and heavyweightSlow and heavyweight No fine-grained object No fine-grained object

modelsmodels EJB QL requires EJB QL requires

deploy-time definition deploy-time definition of queries.of queries.

Page 22: Jug 30 10 04 Jdo

2002-2004 :2002-2004 : JDO 1.0.1JDO 1.0.1

2004-2005 :2004-2005 : JDO2.0JDO2.0 Aggregate and Projection SupportAggregate and Projection Support Detach / AttachDetach / Attach O/R Mapping Meta-DataO/R Mapping Meta-Data

Page 23: Jug 30 10 04 Jdo

Fine 2003 JDO 2.0 Expert Group nuovi membri: Rod Johnson (Spring) Gavin King (Hibernate)

Hibernate implementerà le specifiche JDO/R 2.0 in alternativa a quelle già presenti.

JDO/R 2.0JDO/R 2.0

Page 24: Jug 30 10 04 Jdo

http://www.jdocentral.com

Page 25: Jug 30 10 04 Jdo

Remember: developing J2EE applications should be fun.