Corso di Laurea in Ingegneria Informatica -
Università di Roma "La Sapienza"
Corso di Progetto di Applicazioni Software - A.A. 2008/2009
Esercitazione 4
Obiettivi dell'esercitazione:
- Definire gli object-relational mapping tra classi
di dominio persistenti e tabelle di una base di dati.
- Configurare Hibernate per l'accesso ad una base di dati.
- Realizzare un'applicazione che usi Hibernate per
la gestione della persistenza.
Specifica dell'applicazione:
Si intende realizzare un'applicazione
che permette al
Ministero dell'Istruzione di effettuare dei controlli sull'insegnamento
nelle scuole
elementari. A tal fine, si parte da questo
diagramma delle classi di
dominio, e da questa tabella
delle responsabilità.
Esercizio 1
Obiettivo: Definire gli object-relational mapping
tra classi
di dominio persistenti e tabelle di una base di dati.
- Creare la base di dati Scuole, con il seguente script SQL.
- In Eclipse, creare un nuovo progetto Java chiamato
Scuole.
- Organizzare la cartella corrispondente al progetto appena
creato (contenuta nel vostro
workspace) come
visto a lezione, ovvero in sottocartelle src,lib,bin.
All'interno della cartella lib
copiare le cartelle
necessarie per Hibernate, disponibili nell'apposita sottocartella del
vostro workspace.
- In Eclipse, impostare correttamente il classpath, definendo
in maniera appropriata le proprietà del progetto. Per farlo,
selezionare il progetto, ed accedere alle sue proprietà o
attraverso il menu
File o cliccando sul tasto
destro del mouse. In particolare, ricordarsi di aggiungere i
jar esterni che avete copiato nella cartella lib.
- Copiare all'interno della cartella
src
le classi Java così
realizzate.
- Definire i file di mapping tenendo presente che:
- tutte le
classi di dominio sono persistenti, fatta eccezione per
Classe,
poiché il cliente della nostra applicazione, al termine
dell'utilizzo della stessa, non ha interesse a tenere traccia
dell'assegnazione di un particolare insegnante ad una certa classe;
- a volte nel mappare una proprietà è
necessario specificare il tipo Hibernate mediante l'uso
dell'attributo
type;
- se una proprietà persistente di una classe
è un'istanza (o un insieme di istanze) di un'altra classe
persistente, allora nel file di mapping si definisce come mappare
tale proprietà usando
l'elemento
one-to-one (o risp. l'elemento one-to-many)
invece dell'elemento property (cf. manuale
di Hibernate); usare quest'approccio per mappare la
proprietà scuola della
classe LavoratoreScolastico;
- le
proprietà
residenza e indirizzo
di tipo Indirizzo, rispettivamente delle
classi LavoratoreScolastico e ScuolaElementare,
possono essere mappate usando l'elemento component
e tanti
elementi suoi figli property quante sono le
proprietà della classe Indirizzo(cf.
manuale
di Hibernate);
- per mappare le classi di una gerarchia UML su tabelle
ottenute a partire da uno schema ER con lo stesso tipo
di gerarchia, Hibernate prevede la definizione di un unico
file di mapping associato alla classe padre di questo tipo.
Salvare i file di mapping allo stesso livello delle
relative
classi Java.
Esercizio 2
Obiettivo: Configurare Hibernate per l'accesso ad
una base di dati.
- Framework. Partire
dal file
hibernate.properties
(originariamente contenuto nella cartella etc
della distribuzione di hibernate), salvarlo
nella radice del classpath dell'applicazione e modificarlo per:
- l'accesso alla base di dati creata precedentemente,
- l'utilizzo del software C3P0 per la gestione di un pool
di connessioni,
- richiedere che il codice SQL generato sia stampato a
schermo.
- Logging. Partire
dal file
log4j.properties
(anche questo originariamente contenuto nella cartella etc)
e salvarlo
nella radice del classpath dell'applicazione. Qui sono specificate le
principali proprietà del meccanismo di logging usato, nel
nostro caso Apache
Log4j.
- Mapping.
Partire dal file
hibernate.cfg.xml
(anche questo originariamente contenuto nella cartella etc),
salvarlo
nella radice del classpath dell'applicazione e modificarlo per
mantenere solo gli elementi mapping
relativi ai file di mapping definiti al punto precedente.
N.B. In alternativa all'utilizzo del file hibernate.properties
specificato al punto 1, è
possibile definire le proprietà del framework nel
file hibernate.cfg.xml (cf. lezione).
- Realizzare la classe
HibernateUtil
come visto a lezione,
all'interno di un package persistence. Tale
classe serve per la gestione di un unico
oggetto SessionFactory condiviso da
tutta l'applicazione, che fa da "fabbrica" di connessioni alla base di
dati, ovvero di istanze della classe org.hibernate.Session.
Esercizio 3
Obiettivo: Testare
l'applicazione.
Le soluzioni degli esercizi sono
disponibili al link.