SlideShare uma empresa Scribd logo
1 de 25
Baixar para ler offline
Jug meeting 30-10-04
   Dessì Massimiliano

   desmax74@yahoo.it
Quando aiutano i JDO ?
   Permettono la persistenza “ad oggetti”,“mascherando”
    il gap esistente tra un database relazionale e il
    linguaggio ad oggetti usato nelle applicazioni java.

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

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

   Quando gli oggetti possono essere acquisiti in grande
    numero, ma aggiornati o cancellati individualmente
   Con JDO si intende uno standard per la persistenza
    di oggetti java, utilizzabile su tutti gli ambienti java
    (da J2ME a J2EE ).

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

   Oggetti locali.

   Persistenza ricca di funzionalità.
   Sviluppo semplificato, contenuto informativo dei
    descrittori di persistenza (metadati) ridotto.

   Trasparenza assoluta dello strato di persistenza.

   Possibilità di utilizzo con tutte le piattaforme JAVA,
    dalla semplice JVM ai container J2EE (le specifiche
    parlano di ambienti managed e non).
Quando si parla di trasparenza dello strato di
persistenza dei JDO, l’obiettivo è quello di permettere
al programmatore di concentrarsi sulla logica di
business, senza dover manualmente aggiungere
nessuna istruzione di persistenza nelle classi che
modellano i business object. Questo codice può essere
aggiunto alla classe con differenti modalità, che
troviamo nelle specifiche e che possiamo riassumere
con: prima della compilazione, dopo la compilazione,
direttamente nel codice (in questo caso senza la
trasparenza).
Finora quasi tutti i produttori utilizzano la seconda

soluzione, con un tool chiamato enhancer, che modifica

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

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

Il programmatore si occupa di scrivere il codice di
persistenza, per i JDO le specifiche propongono
un enhancer.
Esempio pratico (Xorm):
database contenete DVD
db.properties

javax.JDO.PersistenceManagerFactoryClass=
                    org.xorm.InterfaceManagerFactory

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

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

javax.JDO.option.ConnectionDriverName=org.postgresql.Driver
javax.JDO.MinPool=2
javax.JDO.MaxPool=5
jdo.xml generato da Xorm

<?xml version=quot;1.0quot; encoding=quot;UTF-8quot;?>
<!DOCTYPE database SYSTEM quot;database.dtdquot;>
<database>
   <table name=quot;dvdquot;>
        <column name=quot;titoloquot; type=quot;varcharquot; />
        <column name=quot;prezzoquot; type=quot;integerquot; />
        <column name=quot;idquot; type=quot;integerquot; primary-
                key=quot;truequot; auto=quot;truequot; non-null=quot;truequot; />
   </table>
</database>
db.jdo generato da Xorm
<?xml version=quot;1.0quot; encoding=quot;UTF-8quot;?>
<!DOCTYPE jdo SYSTEM quot;jdo.dtdquot;>
<jdo>
    <package name=“org.casamia.catalogo.jdo.dbquot;>
        <class name=quot;Dvdquot;>
            <extension vendor-name=quot;XORMquot; key=quot;tablequot;
                           value=quot;dvdquot; />
                <field name=quot;titoloquot;>
                   <extension vendor-name=quot;XORMquot; key=quot;columnquot;
                           value=quot;titoloquot; />
                </field>
                <field name=quot;prezzoquot;>
                   <extension vendor-name=quot;XORMquot; key=quot;columnquot;
                           value=quot;prezzoquot; />
                </field>
         </class>
    </package>
</jdo>
Interfaccia generata da Xorm

  public interface Dvd {

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

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

  }
Value Object
public class DvdVO implements Dvd, Serializable {

   public DvdVO() {}

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

   public String getTitolo() {
     return _titolo;
   }

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

  public int getPrezzo() {
      return _prezzo;
  }
package org.casamia.catalogo.jdo;

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


public class CatalogoJdo {

  public CatalogoJdo() { }

  public static void main(String[] args) {

      CatalogoJdo catalogo = new CatalogoJdo();
      Collection lista = catalogo.getLista(quot;Dvdquot;, quot;titoloquot;);
      Iterator iter = lista.iterator();
      while (iter.hasNext()) {
         Dvd item = (Dvd) iter.next();
         System.out.println(quot;prezzo dvd quot; + item.getPrezzo());
         System.out.println(quot;titolo dvd quot; + item.getTitolo());
      }
  }
public Collection getLista(String media, String elementOrder) {

Collection result = null;
try {
    InputStream in = this.getClass().getResourceAsStream
      (quot;db.propertiesquot;);
    PersistenceManagerFactory factory =
      XORM.newPersistenceManagerFactory(in);

    PersistenceManager pm =
      factory.getPersistenceManager();
    _extent = pm.getExtent(Dvd.class, true);
    Query query = pm.newQuery(extent);
    query.setOrdering(elementOrder+quot;.ascendingquot;);

    result = (Collection) query.execute();

    } catch (Exception ex) {
        …….
JDOQL
   Java programming language syntax
   JDOQL is data-store independent
   JDO removes SQL dependencies for querying
    persistent data
   Efficient architecture (no instantiation)
   Query instances created by PersistenceManager
   Application must provide
     • Candidate collection (extent, previous query)
     • Class of result
     • Variable declaration, parameter declarations,
       filter expression, import declarations, ordering
       declarations
JDOQL (1)

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

String filter = “prezzo > 30”;

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

q.setOrdering(“descending”);

Collection results = (Collection) q.execute();
JDOQL (2)
String params = “float min, float max”;

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

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

q.declareParameters (params);

Collection results = (Collection) q.execute
 (new Float (20.5F), new Float (39.30F));
salvataggio
PersistenceManagerFactory factory =

XORM.newPersistenceManagerFactory(in);

PersistenceManager pm =
factory.getPersistenceManager();

DVD matrix = new DVD(“Matrix revolution”, “27”);

pm.currentTransaction().begin();
pm.makePersistent (emp);
pm.currentTransaction ().commit ();
pm.close ();
pmf.close ();
Feature                  Serialization   JDBC               JDO

Data Model               Java            Relational table   Java
                                         model
Support of Java          Yes             No                 Yes
Classes
Access granularity       Object Graph    Table cell         Object / Fetch
Support of inheritance   Yes             No                 Group
                                                            Yes
and polymorphism
Support of references    Yes             No                 Yes
and collections
Automatic                No              No                 Yes
management of cache
Transactions             No              Yes                Yes
Concurrency              No              Yes                Yes
Query Language           None            SQL, each vendor   JDOQL, standard
                                         has a different    language, Java-like
                                         dialect (not       syntax
                                         portable).
Object model             No              No                 Yes
supported in queries
Entity Beans                  JDO
   Component-oriented          JDO is object-oriented
      Inheritance                Inheritance
      Polymorphism               Polymorphism
      Encapsulation              Encapsulation
   Couples persistence
    to tx and security
                                Easy to test, develop
                                 and deploy
   Slow and heavyweight
   No fine-grained object
                                Highly flexible
    models                      Java-centric
   EJB QL requires
    deploy-time definition
    of queries.
2002-2004 :
 JDO 1.0.1




2004-2005 :
  JDO2.0
 Aggregate and Projection Support

 Detach / Attach

 O/R Mapping Meta-Data
JDO/R 2.0



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.
http://www.jdocentral.com
Remember: developing J2EE
 applications should be fun.

Mais conteúdo relacionado

Destaque

Spring, IBatis e Transazioni Aop Nel Jug Avis Web
Spring, IBatis e Transazioni Aop Nel Jug Avis WebSpring, IBatis e Transazioni Aop Nel Jug Avis Web
Spring, IBatis e Transazioni Aop Nel Jug Avis WebMassimiliano Dessì
 
Spring E Spring Web Flow Nel Progetto Jug Avis Web
Spring E Spring Web Flow Nel Progetto Jug Avis WebSpring E Spring Web Flow Nel Progetto Jug Avis Web
Spring E Spring Web Flow Nel Progetto Jug Avis WebMassimiliano Dessì
 
MongoDB SpringFramework Meeting september 2009
MongoDB SpringFramework Meeting september 2009MongoDB SpringFramework Meeting september 2009
MongoDB SpringFramework Meeting september 2009Massimiliano Dessì
 
Jaxitalia09 Spring Best Practices
Jaxitalia09 Spring Best PracticesJaxitalia09 Spring Best Practices
Jaxitalia09 Spring Best PracticesMassimiliano Dessì
 
MongoDB Scala Roma SpringFramework Meeting2009
MongoDB Scala Roma SpringFramework Meeting2009MongoDB Scala Roma SpringFramework Meeting2009
MongoDB Scala Roma SpringFramework Meeting2009Massimiliano Dessì
 

Destaque (7)

Spring, IBatis e Transazioni Aop Nel Jug Avis Web
Spring, IBatis e Transazioni Aop Nel Jug Avis WebSpring, IBatis e Transazioni Aop Nel Jug Avis Web
Spring, IBatis e Transazioni Aop Nel Jug Avis Web
 
Spring E Spring Web Flow Nel Progetto Jug Avis Web
Spring E Spring Web Flow Nel Progetto Jug Avis WebSpring E Spring Web Flow Nel Progetto Jug Avis Web
Spring E Spring Web Flow Nel Progetto Jug Avis Web
 
MongoDB SpringFramework Meeting september 2009
MongoDB SpringFramework Meeting september 2009MongoDB SpringFramework Meeting september 2009
MongoDB SpringFramework Meeting september 2009
 
Dessi Tech Day2008 Cagliari
Dessi Tech Day2008 CagliariDessi Tech Day2008 Cagliari
Dessi Tech Day2008 Cagliari
 
Jaxitalia09 Spring Best Practices
Jaxitalia09 Spring Best PracticesJaxitalia09 Spring Best Practices
Jaxitalia09 Spring Best Practices
 
Isefac sqli e-merchandising_2013
Isefac sqli e-merchandising_2013Isefac sqli e-merchandising_2013
Isefac sqli e-merchandising_2013
 
MongoDB Scala Roma SpringFramework Meeting2009
MongoDB Scala Roma SpringFramework Meeting2009MongoDB Scala Roma SpringFramework Meeting2009
MongoDB Scala Roma SpringFramework Meeting2009
 

Semelhante a Jug 30 10 04 Jdo

Netbeans e Xdebug per debugging e profiling di applicazioni PHP
Netbeans e Xdebug per debugging e profiling di applicazioni PHPNetbeans e Xdebug per debugging e profiling di applicazioni PHP
Netbeans e Xdebug per debugging e profiling di applicazioni PHPGiorgio Cefaro
 
Primo Incontro Con Scala
Primo Incontro Con ScalaPrimo Incontro Con Scala
Primo Incontro Con ScalaFranco Lombardo
 
Webbit 2004: Tiger, java
Webbit 2004: Tiger, javaWebbit 2004: Tiger, java
Webbit 2004: Tiger, javaMatteo Baccan
 
Scala: come recuperare la programmazione funzionale e perché
Scala: come recuperare la programmazione funzionale e perchéScala: come recuperare la programmazione funzionale e perché
Scala: come recuperare la programmazione funzionale e perchéEdmondo Porcu
 
Sviluppo Rapido Di Applicazioni Con Grails
Sviluppo Rapido Di Applicazioni Con GrailsSviluppo Rapido Di Applicazioni Con Grails
Sviluppo Rapido Di Applicazioni Con GrailsAlberto Brandolini
 
Inversion of control e Dependency Injection (ITA)
Inversion of control e Dependency Injection (ITA)Inversion of control e Dependency Injection (ITA)
Inversion of control e Dependency Injection (ITA)Giancarlo Valente
 
Javaday 2006: Java 5
Javaday 2006: Java 5Javaday 2006: Java 5
Javaday 2006: Java 5Matteo Baccan
 
JSP Tag Library
JSP Tag LibraryJSP Tag Library
JSP Tag Libraryjgiudici
 
JSP Tag Library
JSP Tag LibraryJSP Tag Library
JSP Tag Libraryjgiudici
 
JSP Tag Library
JSP Tag LibraryJSP Tag Library
JSP Tag Libraryjgiudici
 
Eclipse emf
Eclipse emfEclipse emf
Eclipse emfAdvenias
 
Polyglot Persistance con PostgreSQL, CouchDB, MongoDB, Redis e OrientDB
Polyglot Persistance con PostgreSQL, CouchDB, MongoDB, Redis e OrientDBPolyglot Persistance con PostgreSQL, CouchDB, MongoDB, Redis e OrientDB
Polyglot Persistance con PostgreSQL, CouchDB, MongoDB, Redis e OrientDBSteve Maraspin
 
Javascript avanzato: sfruttare al massimo il web
Javascript avanzato: sfruttare al massimo il webJavascript avanzato: sfruttare al massimo il web
Javascript avanzato: sfruttare al massimo il webRoberto Messora
 

Semelhante a Jug 30 10 04 Jdo (20)

Java Advanced
Java AdvancedJava Advanced
Java Advanced
 
Applicazioni native in java
Applicazioni native in javaApplicazioni native in java
Applicazioni native in java
 
SCBCD 1. generic ejb
SCBCD 1. generic ejbSCBCD 1. generic ejb
SCBCD 1. generic ejb
 
Netbeans e Xdebug per debugging e profiling di applicazioni PHP
Netbeans e Xdebug per debugging e profiling di applicazioni PHPNetbeans e Xdebug per debugging e profiling di applicazioni PHP
Netbeans e Xdebug per debugging e profiling di applicazioni PHP
 
Il testing con zend framework
Il testing con zend frameworkIl testing con zend framework
Il testing con zend framework
 
Java codestyle & tipstricks
Java codestyle & tipstricksJava codestyle & tipstricks
Java codestyle & tipstricks
 
Primo Incontro Con Scala
Primo Incontro Con ScalaPrimo Incontro Con Scala
Primo Incontro Con Scala
 
Webbit 2004: Tiger, java
Webbit 2004: Tiger, javaWebbit 2004: Tiger, java
Webbit 2004: Tiger, java
 
#dd12 grillo daniele_xpages_tips_tricks_rev2
#dd12 grillo daniele_xpages_tips_tricks_rev2#dd12 grillo daniele_xpages_tips_tricks_rev2
#dd12 grillo daniele_xpages_tips_tricks_rev2
 
Scala: come recuperare la programmazione funzionale e perché
Scala: come recuperare la programmazione funzionale e perchéScala: come recuperare la programmazione funzionale e perché
Scala: come recuperare la programmazione funzionale e perché
 
Sviluppo Rapido Di Applicazioni Con Grails
Sviluppo Rapido Di Applicazioni Con GrailsSviluppo Rapido Di Applicazioni Con Grails
Sviluppo Rapido Di Applicazioni Con Grails
 
Inversion of control e Dependency Injection (ITA)
Inversion of control e Dependency Injection (ITA)Inversion of control e Dependency Injection (ITA)
Inversion of control e Dependency Injection (ITA)
 
Javaday 2006: Java 5
Javaday 2006: Java 5Javaday 2006: Java 5
Javaday 2006: Java 5
 
Oo Javascript
Oo JavascriptOo Javascript
Oo Javascript
 
JSP Tag Library
JSP Tag LibraryJSP Tag Library
JSP Tag Library
 
JSP Tag Library
JSP Tag LibraryJSP Tag Library
JSP Tag Library
 
JSP Tag Library
JSP Tag LibraryJSP Tag Library
JSP Tag Library
 
Eclipse emf
Eclipse emfEclipse emf
Eclipse emf
 
Polyglot Persistance con PostgreSQL, CouchDB, MongoDB, Redis e OrientDB
Polyglot Persistance con PostgreSQL, CouchDB, MongoDB, Redis e OrientDBPolyglot Persistance con PostgreSQL, CouchDB, MongoDB, Redis e OrientDB
Polyglot Persistance con PostgreSQL, CouchDB, MongoDB, Redis e OrientDB
 
Javascript avanzato: sfruttare al massimo il web
Javascript avanzato: sfruttare al massimo il webJavascript avanzato: sfruttare al massimo il web
Javascript avanzato: sfruttare al massimo il web
 

Mais de Massimiliano Dessì

When Old Meets New: Turning Maven into a High Scalable, Resource Efficient, C...
When Old Meets New: Turning Maven into a High Scalable, Resource Efficient, C...When Old Meets New: Turning Maven into a High Scalable, Resource Efficient, C...
When Old Meets New: Turning Maven into a High Scalable, Resource Efficient, C...Massimiliano Dessì
 
Microservices in Go_Dessi_Massimiliano_Codemotion_2017_Rome
Microservices in Go_Dessi_Massimiliano_Codemotion_2017_Rome Microservices in Go_Dessi_Massimiliano_Codemotion_2017_Rome
Microservices in Go_Dessi_Massimiliano_Codemotion_2017_Rome Massimiliano Dessì
 
Dessi docker kubernetes paas cloud
Dessi docker kubernetes paas cloudDessi docker kubernetes paas cloud
Dessi docker kubernetes paas cloudMassimiliano Dessì
 
Web Marketing Training 2014 Community Online
Web Marketing Training 2014 Community OnlineWeb Marketing Training 2014 Community Online
Web Marketing Training 2014 Community OnlineMassimiliano Dessì
 
Vert.X like Node.js but polyglot and reactive on JVM
Vert.X like Node.js but polyglot and reactive on JVMVert.X like Node.js but polyglot and reactive on JVM
Vert.X like Node.js but polyglot and reactive on JVMMassimiliano Dessì
 
Reactive applications Linux Day 2013
Reactive applications Linux Day 2013Reactive applications Linux Day 2013
Reactive applications Linux Day 2013Massimiliano Dessì
 
Scala Italy 2013 extended Scalatra vs Spring MVC
Scala Italy 2013 extended Scalatra vs Spring MVCScala Italy 2013 extended Scalatra vs Spring MVC
Scala Italy 2013 extended Scalatra vs Spring MVCMassimiliano Dessì
 
Codemotion 2013 scalatra_play_spray
Codemotion 2013 scalatra_play_sprayCodemotion 2013 scalatra_play_spray
Codemotion 2013 scalatra_play_sprayMassimiliano Dessì
 
Why we cannot ignore functional programming
Why we cannot ignore functional programmingWhy we cannot ignore functional programming
Why we cannot ignore functional programmingMassimiliano Dessì
 
Three languages in thirty minutes
Three languages in thirty minutesThree languages in thirty minutes
Three languages in thirty minutesMassimiliano Dessì
 

Mais de Massimiliano Dessì (20)

Code One 2018 maven
Code One 2018   mavenCode One 2018   maven
Code One 2018 maven
 
When Old Meets New: Turning Maven into a High Scalable, Resource Efficient, C...
When Old Meets New: Turning Maven into a High Scalable, Resource Efficient, C...When Old Meets New: Turning Maven into a High Scalable, Resource Efficient, C...
When Old Meets New: Turning Maven into a High Scalable, Resource Efficient, C...
 
Hacking Maven Linux day 2017
Hacking Maven Linux day 2017Hacking Maven Linux day 2017
Hacking Maven Linux day 2017
 
Microservices in Go_Dessi_Massimiliano_Codemotion_2017_Rome
Microservices in Go_Dessi_Massimiliano_Codemotion_2017_Rome Microservices in Go_Dessi_Massimiliano_Codemotion_2017_Rome
Microservices in Go_Dessi_Massimiliano_Codemotion_2017_Rome
 
Dessi docker kubernetes paas cloud
Dessi docker kubernetes paas cloudDessi docker kubernetes paas cloud
Dessi docker kubernetes paas cloud
 
Docker dDessi november 2015
Docker dDessi november 2015Docker dDessi november 2015
Docker dDessi november 2015
 
Docker linuxday 2015
Docker linuxday 2015Docker linuxday 2015
Docker linuxday 2015
 
Openshift linuxday 2014
Openshift linuxday 2014Openshift linuxday 2014
Openshift linuxday 2014
 
Web Marketing Training 2014 Community Online
Web Marketing Training 2014 Community OnlineWeb Marketing Training 2014 Community Online
Web Marketing Training 2014 Community Online
 
Vert.X like Node.js but polyglot and reactive on JVM
Vert.X like Node.js but polyglot and reactive on JVMVert.X like Node.js but polyglot and reactive on JVM
Vert.X like Node.js but polyglot and reactive on JVM
 
Reactive applications Linux Day 2013
Reactive applications Linux Day 2013Reactive applications Linux Day 2013
Reactive applications Linux Day 2013
 
Scala Italy 2013 extended Scalatra vs Spring MVC
Scala Italy 2013 extended Scalatra vs Spring MVCScala Italy 2013 extended Scalatra vs Spring MVC
Scala Italy 2013 extended Scalatra vs Spring MVC
 
Codemotion 2013 scalatra_play_spray
Codemotion 2013 scalatra_play_sprayCodemotion 2013 scalatra_play_spray
Codemotion 2013 scalatra_play_spray
 
Why we cannot ignore functional programming
Why we cannot ignore functional programmingWhy we cannot ignore functional programming
Why we cannot ignore functional programming
 
Scala linux day 2012
Scala linux day 2012 Scala linux day 2012
Scala linux day 2012
 
Three languages in thirty minutes
Three languages in thirty minutesThree languages in thirty minutes
Three languages in thirty minutes
 
MongoDB dessi-codemotion
MongoDB dessi-codemotionMongoDB dessi-codemotion
MongoDB dessi-codemotion
 
MongoDB Webtech conference 2010
MongoDB Webtech conference 2010MongoDB Webtech conference 2010
MongoDB Webtech conference 2010
 
RESTEasy
RESTEasyRESTEasy
RESTEasy
 
Spring Roo Internals Javaday IV
Spring Roo Internals Javaday IVSpring Roo Internals Javaday IV
Spring Roo Internals Javaday IV
 

Jug 30 10 04 Jdo

  • 1. Jug meeting 30-10-04 Dessì Massimiliano desmax74@yahoo.it
  • 2. Quando aiutano i JDO ?  Permettono la persistenza “ad oggetti”,“mascherando” il gap esistente tra un database relazionale e il linguaggio ad oggetti usato nelle applicazioni java.  Adatti quando il dominio degli oggetti prevede un flusso load/edit/store  Adatti quando esiste un sufficiente mappaggio “naturale” tra il dominio degli oggetti e le tabelle  Quando gli oggetti possono essere acquisiti in grande numero, ma aggiornati o cancellati individualmente
  • 3. Con JDO si intende uno standard per la persistenza di oggetti java, utilizzabile su tutti gli ambienti java (da J2ME a J2EE ).  I JDO non fanno parte della J2EE ma sono integrabili con essa, si occupano soltanto del concetto di persistenza.  Oggetti locali.  Persistenza ricca di funzionalità.
  • 4. Sviluppo semplificato, contenuto informativo dei descrittori di persistenza (metadati) ridotto.  Trasparenza assoluta dello strato di persistenza.  Possibilità di utilizzo con tutte le piattaforme JAVA, dalla semplice JVM ai container J2EE (le specifiche parlano di ambienti managed e non).
  • 5. Quando si parla di trasparenza dello strato di persistenza dei JDO, l’obiettivo è quello di permettere al programmatore di concentrarsi sulla logica di business, senza dover manualmente aggiungere nessuna istruzione di persistenza nelle classi che modellano i business object. Questo codice può essere aggiunto alla classe con differenti modalità, che troviamo nelle specifiche e che possiamo riassumere con: prima della compilazione, dopo la compilazione, direttamente nel codice (in questo caso senza la trasparenza).
  • 6. Finora quasi tutti i produttori utilizzano la seconda soluzione, con un tool chiamato enhancer, che modifica (anzi, sostituisce) la classe originaria con una capace di persistere (eccetto Xorm).
  • 7. L’enhancer, ed il codice aggiunto alla classe sono diversi per ciascuna implementazione, ma tutti compatibili, dato che un requisito fissato dalle specifiche è la compatibilità binaria tra le classi “enhanced” dalle diverse implementazioni JDO. Il programmatore si occupa di scrivere il codice di persistenza, per i JDO le specifiche propongono un enhancer.
  • 9. db.properties javax.JDO.PersistenceManagerFactoryClass= org.xorm.InterfaceManagerFactory javax.JDO.option.ConnectionUserName=postgres javax.JDO.option.ConnectionPassword=postgres javax.JDO.option.ConnectionURL= jdbc:postgresql://localhost:5432/miodb javax.JDO.option.ConnectionDriverName=org.postgresql.Driver javax.JDO.MinPool=2 javax.JDO.MaxPool=5
  • 10. jdo.xml generato da Xorm <?xml version=quot;1.0quot; encoding=quot;UTF-8quot;?> <!DOCTYPE database SYSTEM quot;database.dtdquot;> <database> <table name=quot;dvdquot;> <column name=quot;titoloquot; type=quot;varcharquot; /> <column name=quot;prezzoquot; type=quot;integerquot; /> <column name=quot;idquot; type=quot;integerquot; primary- key=quot;truequot; auto=quot;truequot; non-null=quot;truequot; /> </table> </database>
  • 11. db.jdo generato da Xorm <?xml version=quot;1.0quot; encoding=quot;UTF-8quot;?> <!DOCTYPE jdo SYSTEM quot;jdo.dtdquot;> <jdo> <package name=“org.casamia.catalogo.jdo.dbquot;> <class name=quot;Dvdquot;> <extension vendor-name=quot;XORMquot; key=quot;tablequot; value=quot;dvdquot; /> <field name=quot;titoloquot;> <extension vendor-name=quot;XORMquot; key=quot;columnquot; value=quot;titoloquot; /> </field> <field name=quot;prezzoquot;> <extension vendor-name=quot;XORMquot; key=quot;columnquot; value=quot;prezzoquot; /> </field> </class> </package> </jdo>
  • 12. Interfaccia generata da Xorm public interface Dvd { String getTitolo(); void setTitolo(String val); int getPrezzo(); void setPrezzo(int prezzo); }
  • 13. Value Object public class DvdVO implements Dvd, Serializable { public DvdVO() {} public void setTitolo(String titolo) { _titolo = titolo; } public String getTitolo() { return _titolo; } public void setPrezzo(int prezzo) { _prezzo = prezzo; } public int getPrezzo() { return _prezzo; }
  • 14. package org.casamia.catalogo.jdo; import org.casamia.catalogo.jdo.db.*; import java.io.*; import java.util.*; import javax.jdo.*; import org.xorm.*; public class CatalogoJdo { public CatalogoJdo() { } public static void main(String[] args) { CatalogoJdo catalogo = new CatalogoJdo(); Collection lista = catalogo.getLista(quot;Dvdquot;, quot;titoloquot;); Iterator iter = lista.iterator(); while (iter.hasNext()) { Dvd item = (Dvd) iter.next(); System.out.println(quot;prezzo dvd quot; + item.getPrezzo()); System.out.println(quot;titolo dvd quot; + item.getTitolo()); } }
  • 15. public Collection getLista(String media, String elementOrder) { Collection result = null; try { InputStream in = this.getClass().getResourceAsStream (quot;db.propertiesquot;); PersistenceManagerFactory factory = XORM.newPersistenceManagerFactory(in); PersistenceManager pm = factory.getPersistenceManager(); _extent = pm.getExtent(Dvd.class, true); Query query = pm.newQuery(extent); query.setOrdering(elementOrder+quot;.ascendingquot;); result = (Collection) query.execute(); } catch (Exception ex) { …….
  • 16. JDOQL  Java programming language syntax  JDOQL is data-store independent  JDO removes SQL dependencies for querying persistent data  Efficient architecture (no instantiation)  Query instances created by PersistenceManager  Application must provide • Candidate collection (extent, previous query) • Class of result • Variable declaration, parameter declarations, filter expression, import declarations, ordering declarations
  • 17. JDOQL (1) Extent dvds = pm.getExtent(DVD.class, true); String filter = “prezzo > 30”; Query q = pm.newQuery(elementOrder, filter); q.setOrdering(“descending”); Collection results = (Collection) q.execute();
  • 18. JDOQL (2) String params = “float min, float max”; String filter = ”dvd.prezzo > min” + “ && dvd.prezzo <= maxquot;; Query q = pm.newQuery (Employee.class, filter); q.declareParameters (params); Collection results = (Collection) q.execute (new Float (20.5F), new Float (39.30F));
  • 19. salvataggio PersistenceManagerFactory factory = XORM.newPersistenceManagerFactory(in); PersistenceManager pm = factory.getPersistenceManager(); DVD matrix = new DVD(“Matrix revolution”, “27”); pm.currentTransaction().begin(); pm.makePersistent (emp); pm.currentTransaction ().commit (); pm.close (); pmf.close ();
  • 20. Feature Serialization JDBC JDO Data Model Java Relational table Java model Support of Java Yes No Yes Classes Access granularity Object Graph Table cell Object / Fetch Support of inheritance Yes No Group Yes and polymorphism Support of references Yes No Yes and collections Automatic No No Yes management of cache Transactions No Yes Yes Concurrency No Yes Yes Query Language None SQL, each vendor JDOQL, standard has a different language, Java-like dialect (not syntax portable). Object model No No Yes supported in queries
  • 21. Entity Beans JDO  Component-oriented  JDO is object-oriented  Inheritance Inheritance  Polymorphism Polymorphism  Encapsulation Encapsulation  Couples persistence to tx and security  Easy to test, develop and deploy  Slow and heavyweight  No fine-grained object  Highly flexible models  Java-centric  EJB QL requires deploy-time definition of queries.
  • 22. 2002-2004 :  JDO 1.0.1 2004-2005 : JDO2.0  Aggregate and Projection Support  Detach / Attach  O/R Mapping Meta-Data
  • 23. JDO/R 2.0 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.
  • 25. Remember: developing J2EE applications should be fun.