Programmazione Java Avanzata Hibernate

Programmazione Java
Avanzata
Hibernate
Ing. Gianluca Caminiti
Riferimenti
Documentazione ufficiale di Hibernate
(manuale e JavaDocs) – www.hibernate.org
3.5.2
Hibernate Tools per Eclipse
http://download.jboss.org/jbosstools/updates/stable
Java Persistence with Hibernate (Manning,2007) –
Capitoli 1-4
Beginning Hibernate - From Novice to Professional.
(APress, 2006).
ORM
La persistenza è quella caratteristica delle
applicazioni orientate agli oggetti che permette agli
oggetti (o alle reti di oggetti) di “sopravvivere” al
processo che li ha creati.
Gli oggetti che non possiedono tale proprietà si
dicono transitori (transient).
L’obiettivo della persistenza è raggiunto
principalmente mediante l’uso di DBMS relazionali.
ORM
L' Object-Relational Mapping (ORM) è un
paradigma di programmazione che permette
l'integrazione fra applicazioni Object-Oriented e
sistemi RDBMS.
Un applicazione ORM fornisce, mediante
un'interfaccia orientata agli oggetti:
I servizi inerenti la persistenza dei dati
Un’astrazione rispetto alle caratteristiche implementative
dello specifico RDBMS utilizzato.
ORM: Vantaggi
Superamento del disadattamento dell'impedenza tra paradigma
relazionale e ad-oggetti (object/relational impedance mismatch).
Riduzione della quantità di codice da scrivere. l'ORM presenta una
semplice interfaccia per realizzare operazioni di tipo CRUD, che sono
per loro natura molto ripetitive e favoriscono la possibilità che
vengano commessi errori durante la stesura del codice che le
implementa.
Approccio stratificato, che isola in un solo livello la logica di
persistenza dei dati, a vantaggio della modularità complessiva del
sistema.
Elevata portabilità rispetto alla tecnologia DBMS utilizzata.
ORM: Vantaggi (2)
Vantaggi delle applicazioni che supportano ORM:
Caricamento automatico della rete degli oggetti secondo i
legami di associazione definiti a livello del linguaggio di
modellazione del dominio (lazy-loading, cioè caricamento
dei dati collegati on-demand).
Rilevamento automatico delle modifiche sui dati e
aggiornamento implicito (dirty-checking)
Gestione della concorrenza nell'accesso ai dati durante
conversazioni (sessioni). Conflitti durante la modifica di un
dato da parte di più utenti in contemporanea, possono essere
automaticamente rilevati dal sistema ORM.
Meccanismi di caching dei dati per migliorare le
prestazioni di accesso al RDBMS utilizzato.
ORM: Vantaggi (3)
Uso del design pattern Unit of Work nella gestione delle
transazioni, per ritardare tutte le azioni di aggiornamento dei
dati al momento della chiusura della conversazione.
P.es. è eseguita solo l'ultima di una serie di update su uno stesso
dato, oppure non viene eseguita affatto una serie di update su di un
dato che in seguito viene eliminato;
Il colloquio con il DBMS avviene mediante composizione di query
multiple in un unico statement, limitando così al minimo i tempi di
risposta dell'applicazione.
Conseguenze: miglioramento delle le caratteristiche di
correttezza, manutenibilità, portabilità, ecc.
Hibernate
Hibernate è un middleware che permette di automatizzare la
persistenza degli oggetti negli RDBMS.
I mapping fra Java e Tabelle del DB sono fissati dall’utente attraverso
file XML o annotazioni sul codice.
Hibernate permette di scrivere codice che si riferisce agli oggetti Java,
automatizzando le operazioni CRUD, tramite la generazione
automatica del codice SQL che lega gli oggetti alle tabelle del DB.
Esiste un linguaggio di querying (HQL) che fa riferimento ai POJOs
E’ possibile creare il codice Java / lo schema del DB, automaticamente
a partire dai mapping.
E’ possibile partire dal DB per creare le classi (reverse engineering)
Hibernate: Struttura
public interface Session
(Hibernate API)
This is the central API class abstracting the notion of a persistence
service. The lifecycle of a Session is bounded by the beginning and
end of a logical transaction. The main function of the Session is to
offer create, read and delete operations for instances of mapped entity
classes.
Instances may exist in one of three states:
transient: never persistent, not associated with any Session
persistent: associated with a unique Session
detached: previously persistent, not associated with any Session
Transient instances may be made persistent by calling save(), persist()
or saveOrUpdate().
Persistent instances may be made transient by calling delete().
Any instance returned by a get() or load() method is persistent.
Detached instances may be made persistent by
calling update(), saveOrUpdate(), ….
save() and persist() result in an SQL INSERT,
delete() in an SQL DELETE and
update() in an SQL UPDATE.
Changes to persistent instances are detected at flush
time and also result in an SQL UPDATE.
Configurazione in Eclipse
HibernateExample2ManytoOne
HibernateExample3OnetoOne
HibernateExample4OnetoMany
HibernateExample5ManytoMany
HibernateExample6Component