1 Hibernate3 Introduzione alla persistenza

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