Hibernate Introduzione al mondo della persistenza Dott. Doria Mauro [email protected] [email protected] La questione della persistenza Il modo dei database è complesso e le tecniche e le tecnologie sono molte. Per anni nel mondo Java si è dibattuto sulla persistenza. Opinioni discordanti su come realizzarla: – – – Nessun codice java: la persistenza realizzata con stored procedure e il DBMS Speciali componenti come gli Entity beans la tecnica CMP Utilizzo dei DAO con le operazioni CRUD realizzate con JDBC e ancora: – 2 – come realizzare la portabilità se ogni DBMS ha il proprio dialetto? Si dovrebbe passare ad un OODBMS? [email protected] Persistenza manuale con JDBC DBC non ha automatismi di nessun tipo per cui la logica della persistenza è totalmente demandata allo sviluppatore. La persistenza occupa tipicamente il 30% del codice di una applicazione JDBC sembra essere la scelta più adatta in quanto rende comodo e semplice l’accesso ai dati. 3 Utilizzando JDBC bisogna risolvere manualmente il model mismatch Utilizzare JDBC è un lavoro lungo che richiede una grande manutenzione; ci si accorge che molte operazioni possono essere automatizzate! [email protected] Persistenza con la serializzazione 4 Java possiede un meccanismo di persistenza molto potente chiamato serializzazione. La serializzazione è alla base di molte tecniche Java, come RMI (Remote Method Invocation). Con la serializzazione è possibile salvare l’intero (o una parte) objects graph in un file, per poi recuperarlo successivamente. Questa tecnica consente di salvare lo stato degli oggetti in un certo istante di tempo come uno stream di byte. Nessun model mismatch Per recuperare un singolo oggetto è necessario deserializzare l’intero stream di dati. Questo, di fatto, non rende questa tecnica una opzione valida. [email protected] Persistenza con gli EJB EJB 2.1 utilizza un motore interno per la persistenza di particolari bean detti “entity bean”. Tale soluzione si chiama CMP (Container-Managed Persistence) Corrispondenza uno-a-uno tra entity e tabelle Implementa un automatismo per il mapping con il DB. Non supporta associaizoni e query polimorfiche Non sono portabili tra le piattaforme EJB 5 NOTA: EJB 3.0 utilizza un motore ORM (come Hibernate) per la persistenza attraverso lo standard JPA (Java Persistence API) . Gli Entity beans non sono serializabili. E’ necessario ricorrere al patter DTO per il remoting E’ un modello estremamente invasivo. Gli entity beans non sono utilizzabili al di fuori della piattaforma EJB (nonostante il nome) [email protected] Object-oriented database systems 6 Gli OODBMS sono molto potenti e sembrano essere la scelta più appropriata per una applicazione ad oggetti. L’ ODMG (Object Data Management Group) ha definito le specifiche di accesso al OODBMS in diversi linguaggi e molti OODBMS supportano queste specifiche. Queste specifiche, però, sono attualmente insufficienti mancando di una grossa quantità di funzionalità importanti. Questo ha portato ad una scarsa attenzione nei confronti di questa soluzione. Nonostante ultimamente la specifica JDO (Java Data Object) ha tentato un nuovo rilancio questa soluzione, questa rimane estremamente impopolare. [email protected] Object Relational Mapping (ORM) Ultimamente però una soluzione sembra far convergere le diverse linee di pensiero. Questa soluzione si chiama: Object Relational Mapping (ORM) 7 Hibernate è un framework implementa la soluzione ORM opensource che [email protected] Persistenza in una appicazione OO Che si intende per persistenza in una applicazione Object Oriented? Un oggetto vive oltre il processo run-time nel quale è stato costruito. – – 8 Il suo stato viene storato sul disco Lo stato viene ripristinato prelevandolo dal disco e assegnandolo ad un oggetto in modo da ricreare la stessa situazione che si aveva al momento in cui è stato storato sul disco. Questo vale sia per un singolo oggetto che per molti oggetti anche interconnessi tra loro. [email protected] Persistenza in una appicazione OO In una applicazione Object Oriented non tutti gli oggetti sono persistenti. Gli oggetti di cui non si vuole la persistenza si chiamano transient. Una applicazione Java è un mix di oggetti transienti e oggetti persistenti. Ma come organizzare al meglio gli oggetti che compongono l’applicazione? 9 [email protected] Architettura stratificata Una applicazione di dice ben ingegnerizzata quando l’architettura su cui si basa è ben progettata. Una buona architettura si basa su: – – Suddivisione degli aspetti Conseguente stratificazione (layers) del codice in base agli aspetti NOTA: Per semplicità, escludiamo da discorso i “cross cutting concern”, cioè gli aspetti trasversali che richiedono una diversa visione dell’architettura (basata sul paradigma Aspect Oriented) 10 [email protected] Layers Un layer per definizione è: – – 11 Uno strato di codice in grado di comunicare con lo strato che immediatamente lo precede (comunicazione verso l’alto) Uno strato di codice che dipende dallo strato immediatamente successivo (dipendenza verso il basso) Il numero e il tipo di layers cambia in base alla applicazione che si intende costruire [email protected] Interazione tra strati applicativi Esempio di applicazione web con Struts 1: View HTML o JSP Controller ActionForm ActionServlet ActionMapping Model Serivces Object Bean Bean Action JSP ActionForward 12 Bean DAO [email protected] Rapporto tra oggetti e DB Model Business Layer Impiegato Serivces nome DAO impiegato Persistence Layer dataAssunzione Impiegato nome salario dataAssunzione 13 Salario Impiegato Classe “entità” del domain model [email protected] Interazione tra strati applicativi 14 Persistence layer: è composta da classi e componenti responsabili del salvataggio e il recupero da uno o più data sotore (tipicamente DB). Questo contiene quindi, il domain model (le classi che rappresentano le entità di business). Database: data sotore che contiene la rappresentazione persistente dello stato del sistema. Il database è una entità esterna all’applicazione Java. Nel caso si tratti di un RDB (database relazionale), questo include anche lo schema ed eventualmente stored procedure. [email protected] Persistenza in una appicazione OO Quale ruolo gioca il DBMS in una applicazione? Al DBMS vengono demandate molte funzionalità “vitali” legate alla persistenza come: – – – – – – 15 – Storage effettivo dei dati Indicizzazione, ordinamento e ricerca Concorrenza Integraità Condivisione e accesso a diversi utenti e diverse applicazioni Sicurezza …. [email protected] Persistenza in una appicazione OO Quindi cosa dovrebbe fare il “persistence layer”, cioè lo strato di codice Java dedicato alla persistenza? – – – 16 Storare, organizzare, e recuperare dati strutturati dal DB Gestire la concorrenza e l’integrità questi dati Mettere in condivisione questi dati I dati strutturati in Java sono gli oggetti del domain model. La business logic interagisce con il domain model realizzando a run-time un grafo interconnesso di oggetti. [email protected] I due mondi a confronto 17 Su un DBMS i dati vengono trattati attraverso il linguaggio SQL: ciò significa proiezioni e join; i dati vengono sempre trattati in forma tabellare Una applicazione ad oggetti tratta i dati come un grafo interconnesso di oggetti utilizzato dalla business logic Una qualunque soluzione che cerchi di automatizzare il rapporto tra questi due mondi deve necessariamente essere complessa!!! [email protected] I due mondi a confronto Il modello dei dati di un DBMS e il modello dei dati di una applicazione ad oggetti sono diversi NON SI TRATTA DI DUE MODI DIVERSI DI TRATTARE O VISUALIZZARE I DATI DI UNO STESSO MODELLO. SI TRATTA DI DUE MODELLI DIVERSI 18 La differenza tra i due mondi prende il nome di: The paradigm mismatch [email protected] Domande? persistence layer The paradigm mismatch JDBC Serializzazione transient business logic Persistence layer OODBMS Object Relational Mapping 19 domain model EJB