hibernate
DESCRIPTION
HibernateTRANSCRIPT
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 1/124
Introduzione a HibernateVersione preliminare
Antonella Poggi
Dipartimento di informatica e Sistemistica
Sapienza Universita di Roma
Progetto di Applicazioni Software
Anno accademico 2008-2009
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 2/124
Progetto di Applicazioni Software Anno accademico 2008-2009
Riferimenti bibliografici
• Libro “Java Persistence with Hibernate”, Christian
Bauer and Gavin King - Editore: Manning
• Hibernate Reference Documentation (cf. link sulla
pagina web del corso)
A. Poggi 1
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 3/124
Progetto di Applicazioni Software Anno accademico 2008-2009
Argomenti principali
• Introduzione ad Hibernate e suoi principali utilizzi
• Le basi della gestione della persistenza con Hibernate
• Mapping piu complessi
• Le transazioni e il ciclo di vita degli oggetti
• Creare un livello generico per la gestione dellapersistenza
A. Poggi 2
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 4/124
Progetto di Applicazioni Software Anno accademico 2008-2009
Introduzione ad Hibernatee suoi principali utilizzi
A. Poggi 3
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 5/124
Progetto di Applicazioni Software Anno accademico 2008-2009
Hibernate core
• Anche noto come Hibernate o Hibernate 3.3.x
• Software open source e free, distribuito sotto licenza
GNU
• ORM libreria per Java: servizio di base per la gestione
della persistenza in applicazioni Java
→ fornisce un framework per mappare un modello di
dominio object-oriented su di una base di dati
relazionale database
→ caratteristica primaria: mapping da classi Java a
tabelle di una base di dati (e mapping da tipi di dati
Java a tipi di dati SQL)
+ abilita di interrogare la basi di dati
A. Poggi 4
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 6/124
Progetto di Applicazioni Software Anno accademico 2008-2009
• Il codice dell’applicazione usa le API di Hibernate per
gestire la persistenza
• I mapping tra classi Java e tabelle relazionali sono
specificati in appositi file XML
→ in linea di principio , lo sviluppatore e esonerato da:
– richieste di esecuzione di chiamate SQL– gestione manuale dei risultati di chiamate SQL e
loro eventuale conversione in oggetti
• L’applicazione rimane portabile in tutti i sistemi di
gestione supportati, con pochissimo overhead
• Puo essere usato in maniera independente dal tipo di
applicazione, di piattaforma e di ambiente runtime, con
tutti i JDK
A. Poggi 5
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 7/124
Progetto di Applicazioni Software Anno accademico 2008-2009
Hibernate tools
• Insieme di strumenti per Hibernate 3
• Forniscono dei task Ant e dei plugin Eclipse per farereverse engineering, generazione di codice, e, piu in
generale, per interagire con Hibernate
– Ant: strumento per fare il build, la compilazione e il
deployment di applicazioni Java complesse
– Eclipse: ambiente di sviluppo open-source, molto
flessibile
A. Poggi 6
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 8/124
Progetto di Applicazioni Software Anno accademico 2008-2009
Tipici utilizzi di Hibernate
• Top down
• Bottom up
• Meet in the middle
A. Poggi 7
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 9/124
Progetto di Applicazioni Software Anno accademico 2008-2009
Tipici utilizzi di Hibernate: Top Down
• Si parte da un diagramma delle classi di dominio e dalla
sua implementazione in Java e si ha completa liberta
rispetto allo schema della base di dati
• Si specificano i file XML con i mapping edeventualmente, si puo usare Hibernate (in particolare lo
strumento Hibernate hbm2ddl) per generare lo schema
della base di dati
– vantaggi: comodo quando non vi e alcun database
preesistente
– svantaggi: diventa laborioso se si vogliono sfruttare
tutte le caratteristiche del DBMS, e.g. stored
procedure, trigger
A. Poggi 8
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 10/124
Progetto di Applicazioni Software Anno accademico 2008-2009
Tipici utilizzi di Hibernate: Bottom up
• Si parte da un base di dati esistente legacy e si ha
completa liberta rispetto al dominio dell’applicazione
• Si usa una serie di strumenti Hibernate per generare lo
schema della base il codice Java per la gestione della
persistenza, ovvero il codice delle classi persistenti
– jdbcconfiguration: strumento che si connette via
JDBC alla base di dati ed accede ai metadati dal
catalogo della base di dati
– hbm2hbmxml: strumento che prende in ingresso i
metadati ottenuti dal catalogo e genera i file XML
dei mapping
– hbm2cfgxml: strumento che prende in ingresso i
A. Poggi 9
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 11/124
Progetto di Applicazioni Software Anno accademico 2008-2009
metadati ottenuti dal catalogo e genera il file di
configurazione di Hibernate (cf. slides piu avanti)
• Problemi:
– lo schema della base di dati deriva, nella migliore
delle ipotesi, da un “degrado” dello schema ER
⇒ non si potra mai ottenere un diagramma delle
classi che sfrutti caratteristiche importanti della
programmazione ad oggetti, e.g. ereditarieta,
polimorfismo
– la logica dell’applicazione e influenzata dallarappresentazione dei dati ⇒ il diagramma delle classi
di dominio conterra solamente le classi persistenti
A. Poggi 10
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 12/124
Progetto di Applicazioni Software Anno accademico 2008-2009
Tipici utilizzi di Hibernate: Meet in the
middle
• Scenario piu interessante e comune - quello del
progetto richiesto per questo corso!
• Si parte da un diagramma delle classi di dominio
dell’applicazione e da una base di dati preesistente
• Non e in generale possibile mappare un insieme di classi
di dominio su di una base di dati arbitrari
→ si deve seguire un approccio generico all’ORM e
ricorrere ad Hibernate quando possibile, ed in caso
contrario, all’approccio generico DAO
N.B. Nella trattazione che faremo, assumeremo di usare
Hibernate seguendo l’approccio “Meet in the middle”.
A. Poggi 11
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 13/124
Progetto di Applicazioni Software Anno accademico 2008-2009
Le basi della gestionedella persistenza conHibernate
A. Poggi 12
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 14/124
Progetto di Applicazioni Software Anno accademico 2008-2009
Hibernate in azione
5 principali ingredienti di un’applicazione che fa uso di
Hibernate per la gestione della persistenza
• le classi di dominio realizzate in Java
• una base di dati, e.g. realizzata in Mysql
• un file che definisce il mapping di ogni classe persistente
• uno o piu file di configurazione di Hibernate
• le interfacce Hibernate per l’accesso alla base di dati:
Session, Transaction e Query - package
org.hibernate
A. Poggi 13
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 15/124
Progetto di Applicazioni Software Anno accademico 2008-2009
Le classi di dominio
• Le classi di dominio sono definite come in qualsiasi
applicazione Java
→ tipicamente, metodi set e get per l’accesso in
scrittura e lettura delle proprieta degli oggetti della
classe
• metodi di business della classe
A. Poggi 14
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 16/124
Progetto di Applicazioni Software Anno accademico 2008-2009
Diagramma delle classi di dominio - Esempio
Offertaammontare : int
dataCreazione: Date
User nome : String
cognome : String
username: String
password: String
email: String
calcolaCostoSpedi
zione(): int
Itemnome : String
codice : int
descrizione : String
prezzoIniziale: int
giornoInizio: Date
giornoFine: Date
calcolaTempoRes-
iduo(): int
compratoDa0..*
0..*
0..1vincente
relativa
fattaDa0..*
Indirizzovia : String
civico : int
cap: String
città: String
risiede
A. Poggi 15
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 17/124
Progetto di Applicazioni Software Anno accademico 2008-2009
Le classi di dominio - Esempio
package bid;
import java.util.StringTokenizer;
public class User {
private String nome;
private String cognome;
private String username;
private String password;
private String email;
private Indirizzo indirizzo;
public User(){}
public User(String user){
username=user;
A. Poggi 16
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 18/124
Progetto di Applicazioni Software Anno accademico 2008-2009
}
public String getNome() { return nome;}
public void setNome(String nome) { this.nome=nome;}
public String getCognome() { return cognome;}
public void setCognome(String cognome) { this.cognome=cognome;}
public String getUsername() { return username;}
public void setUsername(String username) { this.username=username;}
public String getPassword() { return password;}
public void setPassword(String password) { this.password=password;}
public String getEmail() { return email;}
public void setEmail(String email) { this.email=email;}
public Indirizzo getIndirizzo() { return indirizzo;}
public void setIndirizzo(Indirizzo indirizzo) { this.indirizzo=indirizzo
public int calcolaCostoSpedizione {
A. Poggi 17
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 19/124
Progetto di Applicazioni Software Anno accademico 2008-2009
// funzione che restituisce il costo della spedizione}
}
A. Poggi 18
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 20/124
Progetto di Applicazioni Software Anno accademico 2008-2009
Come organizzare il codice di un’applicazione
che usa Hibernate(1)
WORKDIR+ lib
<Hibernate ed altre librerie>
+ src
+bid
User.java
+ bin
A. Poggi 19
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 21/124
Progetto di Applicazioni Software Anno accademico 2008-2009
La base di dati
• E costituita da un insieme di:
– tabelle
– vincoli
– store procedure, trigger
• E mantenuta all’interno di un certo DBMS, e.g. Mysql,
provvisto del proprio driver jdbc
• Puo essere acceduta da un certo utente (con relativi
privilegi)
A. Poggi 20
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 22/124
Progetto di Applicazioni Software Anno accademico 2008-2009
Tabelle della base di dati - Esempio
CREATE TABLE utente (
username VARCHAR(10) PRIMARY KEY,
nome VARCHAR(15),
cognome VARCHAR(15),
cod_fis VARCHAR(16) UNIQUE,
password VARCHAR(8),
email VARCHAR(20),
via VARCHAR(20),
civico INT,
cap VARCHAR(5),
citta VARCHAR(15));
A. Poggi 21
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 23/124
Progetto di Applicazioni Software Anno accademico 2008-2009
File di mapping per le classi persistenti
• File XML che definisce come si mappano le proprieta
delle classi Java persistenti sulle tabelle della base di
dati
• Deve soddisfare la grammatica specificata all’interno di
un apposito DTD, chiamato
hibernate-mapping-3.0.dtd
N.B. Per verificare la correttezza sintattica del file
XML, Hibernate cerchera il DTD all’interno del
classpath e lo trovera nella libreria .jar di Hibernate
(ammesso che il classpath la includa) - qualora non
dovesse trovare il DTD, Hibernate lo cerchera
all’indirizzo specificato nella dichiarazione del
DOCTYPE
A. Poggi 22
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 24/124
Progetto di Applicazioni Software Anno accademico 2008-2009
File di mapping - Esempio
File User.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="User" table="UTENTE">
<id name="username" column="username"></id>
<property name="nome" column="NOME"></property>
<property name="cognome" column="COGNOME"></property><property name="email"></property>
<property name="password"></property>
</class>
</hibernate-mapping>
A. Poggi 23
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 25/124
Progetto di Applicazioni Software Anno accademico 2008-2009
File di mapping - Commenti
• L’elemento class dichiara il nome della classe
persistente e la tabella a cui essa corrisponde
→ dice ad Hibernate come rendere persistente e
caricare gli oggetti della classe User sfruttando la
tabella UTENTE, ovvero ogni istanza e rappresentata dauna tupla della tabella
• L’elemento id dichiara:
– il nome della proprieta della classe che gioca il ruolo
di identificatore→ Importante:
∗ una classe persistente e sempre caratterizzata da
una proprieta che ne identifica le istanze
∗ una volta creato un oggetto della classe, tale
A. Poggi 24
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 26/124
Progetto di Applicazioni Software Anno accademico 2008-2009
proprieta non potra essere modificata
dall’applicazione (il corrispondente metodo set
puo essere definito privato)
– il nome dell’attributo della tabella che identifica le
tuple mappate su oggetti
• L’elemento property dichiara il nome delle proprieta
persistenti della classe e a quali attributi della tabella
corrispondono; di default, nessuna proprieta e
persistente
→ Importante: come per la proprieta che identifica glioggetti, il nome della proprieta indica ad Hibernate
quali metodi set e get usare
A. Poggi 25
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 27/124
Progetto di Applicazioni Software Anno accademico 2008-2009
Come organizzare il codice di un’applicazioneche usa Hibernate(2)
WORKDIR
+ lib
<Hibernate ed altre librerie>
+ src
+ bid
User.java
User.hbm.xml
+ bin
A. Poggi 26
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 28/124
Progetto di Applicazioni Software Anno accademico 2008-2009
File di configurazione per Hibernate
• Hibernate costituisce la parte dell’applicazione che
gestisce la persistenza, ovvero che si connette alla base
di dati
→ ha bisogno di avere le informazioni necessarie ad
effettuare la connessione, quali il DBMS, il driver
JDBC, la base di dati, utente/password, etc.
• Un file XML fornisce tutte queste informazioni
• Tale file deve soddisfare la grammatica specificata in
nel DTD hibernate- configuration-3.0.dtd
A. Poggi 27
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 29/124
Progetto di Applicazioni Software Anno accademico 2008-2009
File di configurazione per Hibernate -
Esempio
File hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- Database connection settings -->
<property name="hibernate.connection.driver_class">
com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">
jdbc:mysql://localhost/bid</property>
<property name="connection.username">root</property>
<property name="connection.password"></property>
<!-- SQL dialect -->
A. Poggi 28
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 30/124
Progetto di Applicazioni Software Anno accademico 2008-2009
<property name="dialect">
org.hibernate.dialect.MySQL5InnoDBDialect</property>
<!-- JDBC connection pool (use C3P0) -->
<property name="c3p0.min_size">5</property>
<property name="c3p0.max_size">20</property>
<property name="c3p0.timeout">300</property>
<property name="c3p0.max_statement">50</property>
<!-- Show and print nice SQL on stdout -->
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<!-- List of XML mapping files -->
<mapping resource="bid/User.hbm.xml" />
</session-factory>
</hibernate-configuration>
A. Poggi 29
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 31/124
Progetto di Applicazioni Software Anno accademico 2008-2009
File di configurazione per Hibernate -
Commenti
• L’elemento session-factory definisce le impostazioni
per l’accesso ad una particolare base di dati
• Le proprieta il cui nome ha la forma
(hibernate).connection.* contengono le
informazioni necessarie per impostare la connessione
JDBC
• La proprieta dialect specifica la variante di SQL che
deve generare Hibernate
• Le proprieta c3p0.* indicano le impostazioni necessarie
a configurare il software c3p0 per il pooling di
connessioni
A. Poggi 30
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 32/124
Progetto di Applicazioni Software Anno accademico 2008-2009
– min size: numero minimo di connessioni che deono
essere pronte in ogni momento
– max size: numero massimo di connessioni aperte
gestite dal pool
– timeout: tempo al termine del quale una
connessione aperta non piu usata viene rimossa
– max statements: numero di prepared statements
che sono mentenuti in cache
A. Poggi 31
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 33/124
Progetto di Applicazioni Software Anno accademico 2008-2009
Come organizzare il codice di un’applicazioneche usa Hibernate(3)
WORKDIR
+ lib<Hibernate ed altre librerie>
+ src
+ bid
User.java
User.hbm.xmlhibernate.cfg.xml
+ bin
A. Poggi 32
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 34/124
Progetto di Applicazioni Software Anno accademico 2008-2009
Le interfacce Hibernate
Hibernate fornisce tre principali interfacce per l’accesso alla
base di dati, tutte appartenenti al package org.hibernate
• Session: ogni istanza rappresenta una sessione di
comunicazione tra applicazione e base di dati
→ comprende i metodi per salvare/caricare oggetti
nella/dalla base di dati
• Transaction: ogni istanza rappresenta una transazione
→ maggiore disaccoppiamento dell’applicazione: non e
necessario usare l’API JDBC per impostare unatransazione
→ gioca al ruolo di gestore di transazioni in un sistema
che accede a piu basi di dati all’interno di un’unica
unita di lavoro di sistema
A. Poggi 33
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 35/124
Progetto di Applicazioni Software Anno accademico 2008-2009
• Query: interfaccia che permette di creare ed eseguire
query
– sia nel linguaggio di query di Hibernate (HQL) che
in SQL
– che usino al loro interno delle variabili speciali
→ utile in tutti quei casi in cui era necessario ricorre ad
un DCS nell’approccio DAO
A. Poggi 34
S f
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 36/124
Progetto di Applicazioni Software Anno accademico 2008-2009
Interfacce Hibernate - Esempio d’uso
File Bid.java
package bid;
import java.util.*;
import org.hibernate.*;
import persistence.HibernateUtil;
public class Bid {
public static void main(String[] args) {
//First unit of work
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction tx = session.beginTransaction();
User user = new User("pippo");
String userId = (String) session.save(user);
tx.commit();
session.close();
A. Poggi 35
P tt di A li i i S ft A d i 2008 2009
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 37/124
Progetto di Applicazioni Software Anno accademico 2008-2009
//Second unit of work
session = HibernateUtil.getSessionFactory().openSession();
tx = session.beginTransaction();user = (User) session.get(User.class,userId);
user.setNome("Filippo");
tx.commit();
session.close();
//Third unit of work
session = HibernateUtil.getSessionFactory().openSession();
tx = session.beginTransaction()
List users = session.createSQLQuery("select * from utente
order by username").addEntity(User.class).list();
System.out.println(users.size()+" user(s) found: ");
for (Iterator iter= users.iterator(); iter.hasNext(); ) {
User userId = (User) iter.next();
System.out.println (userId.getNome());
}
tx.commit();
A. Poggi 36
P tt di A li i i S ft A d i 2008 2009
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 38/124
Progetto di Applicazioni Software Anno accademico 2008-2009
session.close();
//Shutting down the applicationHibernateUtil.shutdown();
}
}
A. Poggi 37
P tt di A li i i S ft A d i 2008 2009
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 39/124
Progetto di Applicazioni Software Anno accademico 2008-2009
Interfacce Hibernate - Commenti
• L’utilizzo dell’interfaccia Transaction imposta
l’autocommit a false → necessita di chiamare il metodo
commit
• Tutti i comandi SQL sono generati a runtime (o
eventualmente all’avvio dell’applicazione per tutti quei
comandi “riusabili”)
• La prima unita di lavoro, quando eseguita, corrisponde
ad effettuare sulla base di dati un comando SQL simile
a
insert into UTENTE(USERNAME,NOME,COGNOME,COD_FIS,
PASSWORD,EMAIL,VIA,CIVICO,CAP,CITTA)
values (’pippo’, null, null, null,
A. Poggi 38
Progetto di Applicazioni Software Anno accademico 2008 2009
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 40/124
Progetto di Applicazioni Software Anno accademico 2008-2009
null, null, null, null, null, null);
• La seconda unita di lavoro mostra l’abilita di Hibernate
di:
– caricare un oggetto dalla base di dati, a partire dalla
classe di cui e istanza e dal suo identificatore
→ il metodo get(Class,Serializable) restituisce
un’istanza della classe persistente data in inputcaratterizzata dall’identificatore in input, e null se
la suddetta istanza non esiste
N.B. Richiede sia definito il costruttore senza
argomenti per la classe persistente
– effettuare un dirty checking automatico: senza che
sia richiesto esplicitamente di fare l’update
dell’istanza, Hibernate si “accorge” delle modifiche
apportate sulla proprieta nome ed aggiorna
A. Poggi 39
Progetto di Applicazioni Software Anno accademico 2008 2009
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 41/124
Progetto di Applicazioni Software Anno accademico 2008-2009
automaticamente la base di dati
• La terza unita di lavoro mostra come e possibile
“incapsulare” una query di accesso alla base di dati e
ricavare dai risultati oggetti del dominio→ questo tipo di accesso deve essere limitato a quei
casi in cui si usano i DCS nell’approccio DAO, ovvero,
essenzialmente, ai casi in cui e necessario effettuare una
ricerca sulla base di dati non di tipo “diretto”, e.g.
FindByCriteria
A. Poggi 40
Progetto di Applicazioni Software Anno accademico 2008 2009
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 42/124
Progetto di Applicazioni Software Anno accademico 2008-2009
Inizializzazione di Hibernate - SessionFactory
• Per inizializzare Hibernate, si costruisce un oggetto
SessionFactory a partire da un oggetto
Configuration
• un oggetto Configuration, sostanzialmente,
rappresenta il file di configurazione di Hibernate
SessionFactory sessionFactory = new Configuration().
configure().buildSessionFactory();
– quando new Configuration() e chiamato,
Hibernate cerca un file chiamato
hibernate.properties (cf. esercitazione) e tutte
le impostazioni lı definite sono associate all’oggetto
di Configuration
A. Poggi 41
Progetto di Applicazioni Software Anno accademico 2008 2009
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 43/124
Progetto di Applicazioni Software Anno accademico 2008-2009
– quando configure() e chiamato, Hibernate cerca il
file hibernate.cfg.xml
– la locazione in cui Hibernate cerca i file suddetti e
quella specificata nel classpath ⇒ se si vuole usare
un’altra locazione la si deve specificare in input
– esistono altre maniere di impostare delle proprieta
della connessione (cf. documentazione)
• nella maggior parte delle applicazioni, SessionFactory
deve essere istanziato una sola volta durante la fase di
inizializzazione di Hibernate, e gioca il ruolo di gestore
delle sessioni , nel senso che ogni istanza di Session
deve essere creata a partire da lui
⇒ e buona prassi realizzare una classe HibernateUtil
per l’inizializzazione di Hibernate e la gestione della
singola istanza di SessionFactory
A. Poggi 42
Progetto di Applicazioni Software Anno accademico 2008 2009
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 44/124
Progetto di Applicazioni Software Anno accademico 2008-2009
Gestore delle sessioni - HibernateUtil
File HibernateUtil.java
package persistence;
import org.hibernate.*;
import org.hibernate.cfg.*;
public class HibernateUtil {
private static SessionFactory sessionFactory = initHibernateUtil();
private static SessionFactory initHibernateUtil(){
try {
return new Configuration().configure().buildSessionFactory();
} catch (HibernateException ex) {
throw new ExceptionInInitializerError(ex);
}
}
A. Poggi 43
Progetto di Applicazioni Software Anno accademico 2008-2009
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 45/124
Progetto di Applicazioni Software Anno accademico 2008-2009
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
public static void shutdown() {
//Close caches and connection pools
getSessionFactory().close();
}
}
A. Poggi 44
Progetto di Applicazioni Software Anno accademico 2008-2009
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 46/124
Progetto di Applicazioni Software Anno accademico 2008-2009
Come organizzare il codice di un’applicazione
che usa Hibernate(4)
WORKDIR
+ lib
<Hibernate ed altre librerie>
+ src
+bid
User.java
User.hbm.xml
Bid.java
+ persistence
HibernateUtil.java
hibernate.cfg.xml
+ bin
A. Poggi 45
Progetto di Applicazioni Software Anno accademico 2008-2009
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 47/124
Progetto di Applicazioni Software Anno accademico 2008 2009
I mapping
A. Poggi 46
Progetto di Applicazioni Software Anno accademico 2008-2009
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 48/124
Progetto di Applicazioni Software Anno accademico 2008 2009
In poche parole...
I file di mapping permettono di definire:
• come le classi Java che realizzano classi di dominio
UML persistenti siano mappate sugli elementi della
base di dati
• informazioni sugli elementi stessi della base di dati che
vengono mappati
→ queste sono utili nell’approccio top-down, ovvero
quando a partire dalle classi di dominio e dai mapping si
intende generare la base di dati sottostante - in questo
corso non approfondiremo questo argomento
A. Poggi 47
Progetto di Applicazioni Software Anno accademico 2008-2009
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 49/124
Progetto di Applicazioni Software Anno accademico 2008 2009
Note importanti
1. In questa trattazione, assumeremo che la porzione
persistente del diagramma delle classi e lo schema ER
siano “simili”, nel senso che:
• la realizzazione di una classe di dominio persistente
e mappata su una ed un’unica tabella• le realizzazioni di due classi di dominio persistenti in
ISA sono mappate su due tabelle legate da una
foreign key
• le realizzazioni di due classi di dominio persistenti
legate da un’associazione sono mappate su due
tabelle legate da una o piu catene di vincoli di
foreign key/inclusione (che eventualmente
coinvolgono ulteriori tabelle)
A. Poggi 48
Progetto di Applicazioni Software Anno accademico 2008-2009
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 50/124
Progetto di Applicazioni Software Anno accademico 2008 2009
Per tutti i casi di mapping che non rientrano tra i tipi di
cui sopra, Hibernate fornisce delle soluzioni nonsoddisfacibili
→ e pertanto necessario ricorrere all’approccio DAO
A. Poggi 49
Progetto di Applicazioni Software Anno accademico 2008-2009
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 51/124
Progetto di Applicazioni Software Anno accademico 2008 2009
2. la realizzazione in java del diagramma delle classi di
dominio segue le regole viste nel corso di Progettazione
del Software, con le seguenti principali eccezioni,
riguardanti i campi privati persistenti che sono
collezioni:• si definisce il metodo set come per gli altri tipi di campi
- ma attenzione: lo si definisce private
→ permette ad Hibernate, ma non al client, di usarlo
• il metodo get non restituisce un clone della collezione,
bensı la collezione stessa (restrizione di Hibernate)
A. Poggi 50
Progetto di Applicazioni Software Anno accademico 2008-2009
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 52/124
g pp
Mappare una classe Java significa...
• stabilire una corrispondenza tra le sue istanze e le tuple
di una tabella della base di dati
• mappare il suo identificatore
• mappare le sue proprieta persistenti
– proprieta che sono valori (eventualmente insiemi di
attributi/valori, ovvero con molteplicita massima
diversa da 1)
– proprieta che sono istanze di un’altra classe di
dominio Java (eventualmente insiemi di istanze,
ovvero con molteplicita massima diversa da 1)
A. Poggi 51
Progetto di Applicazioni Software Anno accademico 2008-2009
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 53/124
g pp
Mappare gli identificatori delle classi didominio
La proprieta che identifica una classe e una proprieta
“speciale”
• non puo essere modificata una volta che e stata
assegnata ad un’istanza
• dal punto di vista sintattico, una proprieta che
identifica una classe deve essere mappata attraverso
l’elemento XML <id> (che DEVE essere definito)
A. Poggi 52
Progetto di Applicazioni Software Anno accademico 2008-2009
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 54/124
g pp
– <id> puo avere un elemento figlio <generator> che
DEVE un attributo class che specifica una classe
Java che implementa l’interfaccia
org.hibernate.id.IdentifierGenerator e che
viene usata per generare identificatori unici; se tale
classe prende dei parametri in ingresso, vengono
specificati per mezzo di elementi figli param;
Hibernate viene fornito con delle classi built-in per
generare identificatori, tra le altre:
∗ assigned significa che l’applicazione assegna
l’identificatore all’istanza prima che sia chiamato il
metodo save - questo e il comportamento di default segenerator non compare
∗ native: usa i generatori di identificatori forniti dal
DBMS sottostante - mantiene il mapping portabile
A. Poggi 53
Progetto di Applicazioni Software Anno accademico 2008-2009
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 55/124
Mappare proprieta che sono valori con
molteplicita massima pari a 1
Abbiamo gia visto come si definisce nel file di mapping
come mappare una proprieta di una classe che e un valore
→ Si usa l’elemento XML property
Ora diciamo qualcosa in piu sul sistema di tipi di
Hibernate....
A. Poggi 54
Progetto di Applicazioni Software Anno accademico 2008-2009
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 56/124
Il sistema di tipi di Hibernate
• I tipi di Hibernate sono di fatto dei convertitori che
traducono da tipi Java a tipi SQL e viceversa
• La maggior parte dei tipi built-in di Hibernate hanno lo
stesso nome del tipo Java che mappano
• Possono pero esserci piu tipi Hibernate per uno stesso
tipo Java
→ bisogna allora indicare nel mapping il tipo di
mapping di Hibernate da usare
• I tipi built-in di Hibernate non possono essere usati per
fare conversioni di qualsiasi tipo (e.g. da (SQL)
VARCHAR a (Java) Integer), ma si possono definire dei
tipi appositi per effettuare conversioni “ad-hoc”
A. Poggi 55
Progetto di Applicazioni Software Anno accademico 2008-2009
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 57/124
Tipi primitivi di Hibernate: corrispondenze
SQL-Java
Tipo Hibernate Tipo SQL standard Tipo Java
integer INTEGER int or java.lang.Integer
long BIGINT long or java.lang.Long
integer SMALLINT short or java.lang.Integer
float FLOAT float or java.lang.Float
double DOUBLE double or java.lang.Double
big_decimal NUMERIC java.math.BigDecimal
character CHAR(1) java.lang.String
string VARCHAR (..) java.lang.String
byte TINYINT float or java.lang.Float
boolean BIT boolean or java.lang.Boolean
A. Poggi 56
Progetto di Applicazioni Software Anno accademico 2008-2009
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 58/124
Tipi di dati Hibernate sulle date e il tempo
Tipo Hibernate Tipo SQL standard Tipo Java
date DATE java.util.Date or java.sql.Date
time TIME java.util.Time or java.sql.Time
timestamp TIMESTAMP java.util.Timestamp
or java.sql.Timestamp
calendar TIMESTAMP java.util.Calendar
calendar_date DATE java.util.Calendar
A. Poggi 57
Progetto di Applicazioni Software Anno accademico 2008-2009
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 59/124
Come usare i tipi di Hibernate nei mapping
(Esempio)
<class name="Item" table="ITEM">
(...)
<property name="giornoInizio" type="time"
column="INIZIO"/></class>
N.B. Se non specifichiamo il tipo di Hibernate, allora
Hibernate usa la reflection, ovvero risale al tipo Java della
proprieta giornoInizio della classe Item e assume un
comportamento di default
→ se abbiamo definito la proprieta giornoInizio come di
tipo java.util.Date, Hibernate cerca di convertirla nel
tipo TIMESTAMP (= TIME)
A. Poggi 58
Progetto di Applicazioni Software Anno accademico 2008-2009
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 60/124
Classi che realizzano tipi UML
• A valle della fase di progetto, sono spesso individuati
dei tipi UML che sono realizzati tramite classi Java, da
importare o definite nell’applicazione stesse
• Le istanze di una classe che realizza un tipo UML:
– sono proprieta di classi di dominio
– non possono essere condivise
– non sono identificate da nessuna proprieta
• Per le classi che realizzano un nuovo tipo UML, enecessario ridefinire i metodi toString, equals(),
hashCode() e, se qualche funzione della classe Java
effettua side-effect, clone()
A. Poggi 59
Progetto di Applicazioni Software Anno accademico 2008-2009
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 61/124
Mapping di proprieta istanze di una classe
che realizza un tipo UML
Ipotesi: come sempre, le colonne da mappare appartengono
alla stessa tabella su cui e mappata la classe
A seconda che sia o no necessario effettuare una
conversione od una forma di type checking tra i valori delle
proprieta della classe che realizza il tipo UML, ed il valore
degli attributi della base di dati mappati, si usa un diversoapproccio
A. Poggi 60
Progetto di Applicazioni Software Anno accademico 2008-2009
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 62/124
Caso 1: Uso dell’elemento component
L’elemento XML component serve per mappare le proprieta
di una classe Java definita dall’utente che:
• non e una classe di dominio
• deve essere resa persistente nella stessa tabella sulla
quale si definisce il mapping per la classe per la quale
definisce il mapping l’elemento padre dell’elemento
component (N.B. si puo anche fare un uso annidato
dell’elemento component)
→ component puo essere usato quando non si ha bisogno di
effettuare alcuna conversione di tipo
A. Poggi 61
Progetto di Applicazioni Software Anno accademico 2008-2009
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 63/124
Esempio: classe Indirizzo
Ricordiamo che la classe User.java aveva una proprietaindirizzo di tipo Indirizzo. La classe Indirizzo e cosıdefinita:
package bid;
public class Indirizzo {
private String via;
private String cap;
private int numeroCivico;
private String citta;
public Indirizzo(){}
public String getVia() { return via;}
public void setVia(String via) { this.via=via;}
public String getCap() { return cap;}
A. Poggi 62
Progetto di Applicazioni Software Anno accademico 2008-2009
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 64/124
public void setCap(String cap) { this.cap=cap;}
public int getNumeroCivico() { return numeroCivico;}
public void setNumeroCivico(int numero) { this.numeroCivico=numero;}
public String getCitta() { return citta;}
public void setCitta(String citta) { this.citta=citta;}
}
A. Poggi 63
Progetto di Applicazioni Software Anno accademico 2008-2009
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 65/124
Esempio: mapping della proprieta indirizzo
di tipo Indirizzo
Nel file di mapping User.hbm.xml mappiamo la proprietaindirizzo come segue:
<hibernate-mapping>
<class name="bid.User" table="UTENTE">
(...)
<component name="indirizzo" class="bid.Indirizzo">
<property name="via" column="via"></property>
<property name="numeroCivico" column="civico"></property>
<property name="cap" column="cap"></property>
<property name="citta" column="citta"></property>
</component>
</class>
</hibernate-mapping>
A. Poggi 64
Progetto di Applicazioni Software Anno accademico 2008-2009
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 66/124
Caso 2: Uso dei Custom types di Hibernate
Hibernate permette di definire dei tipi Hibernate ad-hoc nei
casi in cui i tipi built-in non siano adeguati
• sono fornite diverse interfacce piu o meno complesse a
seconda del tipo di conversione da effettuare
→ e necessario definire una classe Java che implementa
una delle interfacce e che effettua la conversione
da/verso valori della classe Java che realizza il tipo
verso/da valori nella base di dati
• l’interfaccia piu comunemente usata eorg.hibernate.usertype.UserType: fornisce i metodi
di base per effettuare il caricamento ed il salvataggio di
istanze di classi che realizzano tipi di dato
A. Poggi 65
Progetto di Applicazioni Software Anno accademico 2008-2009
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 67/124
• un’altra interfaccia e
org.hibernate.usertype.CompositeUserType:
fornisce inoltre metodi per esporre/modificare proprieta
“interne” di istanze di classi che realizzano tipi UML -
non rientra negli scopi del corso
A. Poggi 66
Progetto di Applicazioni Software Anno accademico 2008-2009
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 68/124
Interfaccia org.hibernate.usertype.UserType
(Esempio)
Supponiamo che per le proprieta giornoInizio e
giornoFine della classe di dominio Item, si decida di
evitare l’uso del tipo java.sql.Date e si voglia piuttosto
usare il tipo GregorianCalendar
→ si deve definire una classe che effettua la conversione dal
tipo sql DATE degli attributi inizio e fine della tabellaITEM al tipo GregorianCalendar
A. Poggi 67
Progetto di Applicazioni Software Anno accademico 2008-2009
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 69/124
Nel file di mapping Item.hbm.xml si definisce comemappare le proprieta si cui sopra come segue:
<hibernate-mapping>
<class name="bid.Item" table="ITEM">
(...)<property name="giornoInizio" column="inizio"
type="persistence.GregorianCalendarUserType"/>
<property name="giornoFine" column="fine"
type="persistence.GregorianCalendarUserType"/>
</class>
</hibernate-mapping>
A. Poggi 68
Progetto di Applicazioni Software Anno accademico 2008-2009
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 70/124
Esempio: classe che implementa un nuovo
tipo di Hibernate
Implementiamo la classepersistence.GregorianCalendarUserType che realizza ilnuovo tipo di Hibernate per fare la conversione da/versoGregorianCalendar ed il tipo SQL DATE
package persistence;
import java.io.Serializable;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.*;
import org.hibernate.*;
import org.hibernate.usertype.*;
A. Poggi 69
Progetto di Applicazioni Software Anno accademico 2008-2009
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 71/124
public class GregorianCalendarUserType implements UserType{
//indica ad Hibernate i tipi SQL da mappare - possono essere piu di uno
public int[] sqlTypes(){
return new int[] {Hibernate.DATE.sqlType()};
}
//indica ad Hibernate il tipo Java da mappare
public Class returnedClass() {
return GregorianCalendar.class;
}//indica se il tipo Java e immutabile
//utile per effettuare eventuali ottimizzazioni
public boolean isMutable() {
return false;
}
//per eseguire il dirty checking, il tipo Hibernate usa i seguenti//metodi, che tipicamente delegano ai metodi corrispondenti del tipo Ja
public boolean equals(Object x, Object y) throws HibernateException {
if (x==y) return true;
if (x==null || y==null) return false;
return x.equals(y);
A. Poggi 70
Progetto di Applicazioni Software Anno accademico 2008-2009
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 72/124
}
public int hashCode(Object x) throws HibernateException {
return x.hashCode();
}//restituisce una copia del valore del tipo Java - se il tipo
//e immutabile, e sufficiente restituire il riferimento all’oggetto
public Object deepCopy(Object value) throws HibernateException {
if (value==null)
return value;
else {GregorianCalendar g= (GregorianCalendar)
((GregorianCalendar) value).clone();
return g;
}
}
//metodo che converte e restituisce i valori ottenuti dal JDBC//ResultSet nel valore della proprieta Java corrispondente
public Object nullSafeGet(ResultSet resultSet, String[] names, Object o
throws HibernateException,SQLException {
String s = resultSet.getDate(names[0]).toString();
int year=Integer.parseInt(s.substring(0,4));
A. Poggi 71
Progetto di Applicazioni Software Anno accademico 2008-2009
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 73/124
int month=Integer.parseInt(s.substring(5,7));
int day=Integer.parseInt(s.substring(8,10));
return new GregorianCalendar(year,month,day);
}
//metodo che converte e scrive il valore della proprieta Java del
//tipo sul JDBC PreparedStatement che esegue il salvataggio
public void nullSafeSet(PreparedStatement statement, Object value, int i
throws HibernateException, SQLException {
if (value==null){
statement.setNull(index,Hibernate.DATE.sqlType());}
else {
GregorianCalendar g= (GregorianCalendar) value;
String s = g.get(Calendar.YEAR)+"-"+g.get(Calendar.MONTH)+"-"+
g.get(Calendar.DAY_OF_MONTH);
statement.setDate(index,java.sql.Date.valueOf(s));}
}
//metodo chiamato per effettuare il merge di ogetti in stato
//"detached" - cf. lezione piu avanti - se il tipo
//e immutabile, e sufficiente restituire il riferimento all’oggetto
A. Poggi 72
Progetto di Applicazioni Software Anno accademico 2008-2009
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 74/124
public Object replace(Object original, Object target, Object owner)
throws HibernateException {
return deepCopy(original);
}
//metodi chiamati per usare il secondo livello di cache
//in questo corso ignoriamo il secondo livello di cache, pertanto
//questi metodi saranno sempre definiti come segue
public Object assemble(Serializable cached, Object owner)
throws HibernateException {
return cached;
}
public Serializable disassemble(Object value)
throws HibernateException {
return (Serializable) value;
}
}
A. Poggi 73
Progetto di Applicazioni Software Anno accademico 2008-2009
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 75/124
Mappare proprieta che sono valori con
molteplicita massima diversa da 1
Quando si ha una proprieta P persistente di una classe didominio D che e una collezione omogenea (Set,
List,Map...) di valori gestiti da un’altra tabella TABP, allora
nel file di mapping di D si definisce un elemento apposito
Noi vedremo come mappare Set e List, si rimanda alla doc
per gli altri tipi di collezioni omogenee
A. Poggi 74
Progetto di Applicazioni Software Anno accademico 2008-2009
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 76/124
Mappare un attributo di tipo Set
Si usa l’elemento set:
<set name="P" table="TABP">
<key column="IDD"/>
<element type="TypeP" column="ColumnP"/></set>
dove:
• IDD e l’attributo di TABP che identifica l’istanza di D per
la quale si definisce il mapping
• ColumnP e la colonna di TABP che contiene i valori della
collezione mappati
A. Poggi 75
Progetto di Applicazioni Software Anno accademico 2008-2009
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 77/124
Mappare un attributo di tipo List
Si usa l’elemento list:
<list name="P" table="TABP">
<key column="IDD"/><list-index column="POSITION"/>
<element type="TypeP" column="ColumnP"/>
</list>
dove POSITION e l’attributo di TABP che contiene il valore
dell’indice della lista
A. Poggi 76
Progetto di Applicazioni Software Anno accademico 2008-2009
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 78/124
Mappare proprieta che realizzano associazioni
In linea di principio, Hibernate permette di mappare tutte le
realizzazioni di associazioni in Java
• proprieta riferimento ad un’istanza di un’altra classe
persistente
• proprieta insieme di riferimenti ad istanze di un’altra
classe
• proprieta riferimento ad un’istanza di una classe
“TipoLink”
• proprieta insieme di riferimenti ad istanze di una classe
“TipoLink”
A. Poggi 77
Progetto di Applicazioni Software Anno accademico 2008-2009
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 79/124
Proprieta riferimento ad un’istanza di un’altraclasse persistente
Consideriamo il caso di due classi di dominio A e B
persistenti legate da un’associazione R senza attributi, conmolteplicita 0..1 o 1..1, sulla quale solo A ha responsabilita
→ la realizzazione in Java della classe A porta ad una
proprieta PropB che e un riferimento ad un’istanza della
classe B.
Indichiamo con TabA e TabB rispettivamente le tabelle su
cui sono mappate A e B.
A. Poggi 78
Progetto di Applicazioni Software Anno accademico 2008-2009
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 80/124
Ci sono 2 casi:
• Caso 1: TabA ha accorpato la relazione ER
corrispondente a R
→ in TabA sara definito un vincolo di foreign key versoTabB
Si usa l’elemento one-to-one:
<one-to-one name="PropB" class="B"/>
A. Poggi 79
Progetto di Applicazioni Software Anno accademico 2008-2009
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 81/124
• Caso 2: la relazione ER corrispondente a R ha portato
ad una tabella TabR
→ TabR ha due foreign key FKA, FKB verso le tabelle su
cui sono mappate A e B, rispettivamente
Si usa l’elemento join:
<join table="TabR">
<key column="FKA"/>
<many-to-one name="PropB" class="B" column="FKB"/>
</join>
A. Poggi 80
Progetto di Applicazioni Software Anno accademico 2008-2009
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 82/124
Proprieta insieme di riferimenti ad istanze di
un’altra classe persistente
Consideriamo il caso di due classi di dominio A e B
persistenti legate da un’associazione R senza attributi, con
molteplicita 0..∗ o 1..∗, sulla quale solo A ha responsabilita
A. Poggi 81
Progetto di Applicazioni Software Anno accademico 2008-2009
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 83/124
Anche in questo caso, due casi sono possibili:
• Caso 1: TabB ha accorpato la relazione ER
corrispondente a R→ in TabB e definita una foreign key FKA verso TabA
Si usa l’elemento set:
<set table="TabB" optional="true">
<key column="FKA"/><one-to-many class="B"/>
</join>
N.B. In questo caso assumiamo che la chiave primaria
di TabB sia la chiave primaria di TabA - attenzione: se
la chiave primaria di TabB e contenuta nella chiave nella
chiave primaria di TabA, allora Hibernate permette ad
implementare il mapping
A. Poggi 82
Progetto di Applicazioni Software Anno accademico 2008-2009
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 84/124
• Caso 2: la relazione ER corrispondente a R ha portato
ad una tabella TABR
→ TabR ha due foreign key FKA, FKB verso le tabelle su
cui sono mappate A e B, rispettivamente
Si usa anche questa volta l’elemento join:
<join table="TabR" optional="true">
<key column="FKA"/>
<many-to-one name="PropB" class="B" column="FKB"/>
</join>
A. Poggi 83
Progetto di Applicazioni Software Anno accademico 2008-2009
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 85/124
Cascading di oggetti
Quando una classe A ha responsabilita su di un’associazione
AB con B, Hibernate fornisce la possibilita di richiedere che
una qualsiasi operazione di persistenza su A sia transitiva
es. il salvataggio di un oggetto di A, implichi il salvataggio
dell’oggetto di B associato ad A
Si definisce uguale ad "all" l’attributo cascade
dell’elemento XML che definisce il mapping per
l’associazione per indicare ad Hibernate che tutte le
operazioni devono essere persistenti (altrimenti si usa il
nome dell’operazione, e.g. "save-update")
Attenzione: Nel caso del delete transitivo, bisogna fare
attenzione a non lasciare dei riferimenti ad oggetti appesi
(cf. corso di Progettazione del software)
A. Poggi 84
Progetto di Applicazioni Software Anno accademico 2008-2009
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 86/124
Caso in cui si ha una classe di tipo
“TipoLink”
Siano A e B due classi di dominio persistenti legate da
un’associazione R con attributi, tali che:
• R ha un attributo
• e/o A e B hanno entrambe responsabilita su R
→ la realizzazione in Java porta ad una classe java
TipoLinkAB che realizza il link tra le istanze di A e B, ed ad
una classe java che realizza A e ha ad una proprieta PropB
che e un riferimento ad un’istanza della classe TipoLinkAB
Idea: mappiamo anche la classe TipoLinkAB con
l’accortezza di usare un identificatore composto sia
dall’identificatore di A che dall’identificatore B
A. Poggi 85
Progetto di Applicazioni Software Anno accademico 2008-2009
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 87/124
Link mappati piu volte
Quando si mappa piu volte lo stesso link tra oggetti di
classi java, il mapping indica a Hibernate di effettuare la
stessa operazione di persistenza piu volte→ si possono ottenere delle violazioni di chiave!
Si sceglie un verso per il link, e si definisce uguale a "true"
l’attributo inverse del mapping che specifica come
mappare il link nell’altro verso.
Esempio: caso delle classi “TipoLink”
A. Poggi 86
Progetto di Applicazioni Software Anno accademico 2008-2009
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 88/124
Mappare gerarchie
Supponiamo di avere una generalizzazione completa, tale
che due classi A e B specializzano G, rispettivamente
mappate sulle tabelle TabA, TabB e TabG, tali che TabA eTabB abbiano entrambe una foreign key FKA e FKB verso
TabG
Si definisce il mapping per G, definendo come mappare,
oltre alle proprieta di G, anche le proprieta delle suesottoclassi A e B.
A. Poggi 87
Progetto di Applicazioni Software Anno accademico 2008-2009
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 89/124
Si usa l’elemento joined-subclass:
<joined-subclass name="A" table="TabA">
<key column="FKA"/>
(...)
</joined-subclass>
A. Poggi 88
Progetto di Applicazioni Software Anno accademico 2008-2009
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 90/124
Note importanti sul mapping di gerarchie
• Il mapping descritto si puo usare SOLO nel caso in cui
la gerarchia sia completa
• All’interno di uno stesso file di mapping non si possono
usare due elementi joined-subclass e join allo stesso
livello
⇒ In molti casi di gerarchie, non si puo usare Hibernate ma
si deve ricorrere all’approccio DAO
A. Poggi 89
Progetto di Applicazioni Software Anno accademico 2008-2009
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 91/124
Il ciclo di vita degli oggetti
A. Poggi 90
Progetto di Applicazioni Software Anno accademico 2008-2009
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 92/124
Il ciclo di vita degli oggetti persistenti
Un’applicazione orientata agli oggetti che fa uso di un
meccanismo di persistenza deve interagire con il servizio di
persistenza ogni volta che ha bisogno di propagare lo stato
di un oggetto in memoria sulla base di dati
→ lo stato di un oggetto che appartiene ad una classe
persistente cambia a seconda dell’operazione del servizio di
persistenza che viene invocata
A. Poggi 91
Progetto di Applicazioni Software Anno accademico 2008-2009
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 93/124
Il ciclo di vita degli oggetti delle classi
persistenti
saveOrUpdate()
saveOrUpdate()merge()
evict()
close()clear()
delete()
garbage
newgarbageTransiente
Staccato
Persistente
Rimosso
save()
update()
A. Poggi 92
Progetto di Applicazioni Software Anno accademico 2008-2009
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 94/124
Lo stato transiente
• un oggetto creato con un’operazione new entra nello
stato transiente , in quanto non e (ancora) associato
con alcuna tupla della base di dati
• la vita di un oggetto nello stato transiente termina non
appena non esiste piu alcun oggetto che fa riferimento
ad esso (diventa disponibile per il servizio di garbage
collection)
• Hibernate non fornisce alcun servizio di roll-back per gli
oggetti nello stato transiente
A. Poggi 93
Progetto di Applicazioni Software Anno accademico 2008-2009
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 95/124
Lo stato persistente
• un oggetto nello stato persistente e un oggetto che ha
associato un identificatore proveniente dalla base di dati
• un oggetto nello stato persistente e sempre associato
ad un contesto di persistenza, ovvero ad un insieme di
oggetti dell’applicazione “sincronizzati” rispetto alla
base di dati
→ il contesto di persistenza puo essere considerato
come una cache di istanze associata all’istanza sessione(istanza di Session) correntemente aperta: quando la
sessione viene chiusa, la cache viene svuotata
A. Poggi 94
Progetto di Applicazioni Software Anno accademico 2008-2009
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 96/124
Il contesto di persistenza
• il contesto di persistenza e utile ai seguenti fini:
– per fare automatic dirty checking : quando il
contesto di persistenza e chiuso, lo stato della cache
e propagato alla base di dati in maniera
transazionale
→ tutte e sole le proprieta degli oggetti persistenti
che sono state modificate saranno aggiornate
– per fare write-behind : modifiche agli oggetti nel
contesto di persistenza sono propagate alla base didati all’invocazione del metodo flush
→ ottimizza gli accessi e riduce la durata del lock
sul database
A. Poggi 95
Progetto di Applicazioni Software Anno accademico 2008-2009
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 97/124
– per realizzare un raggio dell’applicazione all’interno
del quale gli oggetti coinvolti sono tra loro
consistenti, in modo tale da garantire (i) l’identita
degli oggetti (i.e., una tupla di valori della base didati e associata al piu ad un oggetto), (ii) il
repeatable read
– per ottimizzare gli accessi, realizzando a tutti gli
effetti una cache di primo livello
A. Poggi 96
Progetto di Applicazioni Software Anno accademico 2008-2009
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 98/124
Transazioni e Session
• All’apertura di un nuovo oggetto della classe Session
(metodo openSession() della classe SessionFactory)
viene creata una nuova connessione JDBC con la base
di dati
→ di default, Hibernate imposta l’autocommit a false,
il che comincia a tutti gli effetti una transazione JDBC!
A. Poggi 97
Progetto di Applicazioni Software Anno accademico 2008-2009
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 99/124
• quando viene invocato il metodo flush le modifiche nel
contesto di persistenza sono sincronizzate con la base
di dati
Attenzione: non viene eseguito commit, quindi l’esito
della transazione dipende dal DBMS sottostante⇒ e necessario usare la classe transaction, con i suoi
metodi commit sia rollback
N.B. Di default, il flushing della sessione avviene
implicitamente al quando viene invocato il commit e
prima di eseguire una query
A. Poggi 98
Progetto di Applicazioni Software Anno accademico 2008-2009
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 100/124
Locking ottimistico di sessione
• in caso di accesso concorrente, affinche non occorrano
anomalie di tipo lost-update , Hibernate prevede la
possibilita di abilitare un meccanismo di locking
ottimistico tale che nel momento in cui viene invocato
il flushing, verifica se la porzione della base di dati chesara modificata non sia cambiata
→ se e cambiata lancia un’eccezione
StaleObjectStateException
• per abilitare il locking ottimistico, nell’elemento class
del file di mapping relativo alla classe su cui verte la
modifica, e necessario definire l’attributo
optimistic-lock pari ad all
A. Poggi 99
Progetto di Applicazioni Software Anno accademico 2008-2009
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 101/124
Rendere un oggetto persistente
• un oggetto entra nello stato persistente:
– dopo che sull’oggetto nello stato transiente e
invocato uno dei metodi save/saveOrUpdate
openSession()
T
(Contesto di persistenza)Session
new(O) save(o)
saveOrUpdate(o)
P
N.B. Il metodosaveOrUpdate
verifica prima sel’oggetto occorre nella base di dati ed a seconda
dell’esito della verifica, effettua un’operazione di
INSERT o di UPDATE
A. Poggi 100
Progetto di Applicazioni Software Anno accademico 2008-2009
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 102/124
– quando viene creato (i) invocando uno dei metodi
get e load del servizio di persistenza, (ii) comerisultato di una query, (iii) navigando il grafo degli
oggetti a partire da un’altra istanza persistente
openSession()
T
(Contesto di persistenza)Session
new(O) save(o)
saveOrUpdate(o)
P
N.B. I due metodi get e load si distinguono per il
fatto che se l’identificatore non viene trovato, get
restituisce null mentre load lancia una
ObjectNotFoundException
A. Poggi 101
Progetto di Applicazioni Software Anno accademico 2008-2009
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 103/124
Lo stato staccato
• un oggetto e nello stato staccato se era nello stato
persistente ed e stato poi cancellato dal contesto di
persistenza
→ il riferimento all’oggetto rimane ma puo:
– divenire obsoleto a seguito di cambiamenti sulla
base di dati
– non essere piu sincronizzato con i valori ad esso
associati nella base di datie, in quanto l’applicazionestessa puo modificare alcune sue proprieta
A. Poggi 102
Progetto di Applicazioni Software Anno accademico 2008-2009
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 104/124
• un oggetto puo essere reso staccato invocando uno tra
i metodi evict/ clear (che appunto cancellano
l’istanza/tutte le istanze dalla cache del contesto di
persistenza)
• alla chiusura della sessione, un oggetto entra nellostato staccato
PT S
openSession() flush() close()
(Contesto di persistenza)Session
new(O) save(o)saveOrUpdate(o)
A. Poggi 103
Progetto di Applicazioni Software Anno accademico 2008-2009
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 105/124
• un oggetto nello stato staccato puo tornare ad entrare
nello stato persistente attraverso l’invocazione dei
metodi update/saveOrUpdate
setValue(v)
S S
openSession() flush() close()
(Contesto di persistenza)
Session
update(o)
saveOrUpdate(o)
P
A. Poggi 104
Progetto di Applicazioni Software Anno accademico 2008-2009
d i l f t d i t t
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 106/124
• quando si vuole fare tornare ad essere persistente un
oggetto che e nello stato staccato ed esiste gia
un’istanza persistente corrispondente alla stessa tupla
della base di dati, si invoca il metodo merge, che copia
le proprieta dell’oggetto staccato sulle proprieta
dell’oggetto persistente corrispondente alla stessa tupla
della base di dati
object o’ S
(Contesto di persistenza)
Session
Sobject o
merge(o)
P
flush() close()openSession()
getid(id)
(copy properties(o,o’))
A. Poggi 105
Progetto di Applicazioni Software Anno accademico 2008-2009
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 107/124
Lo stato rimosso
• un oggetto e nello stato rimosso se era nello stato
persistente ed e invocato il metodo delete
→ e stato schedulato per essere rimosso al termine di
un’unita di lavoro, ma fa ancora parte del contesto di
persistenza finche l’unita di lavoro non e completata
load(id) S
(Contesto di persistenza)Session
openSession() flush()
RP
close()
delete(o)
A. Poggi 106
Progetto di Applicazioni Software Anno accademico 2008-2009
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 108/124
• un oggetto nello stato rimosso non deve essere
“riusato” e devono essere rimossi tutti i riferimenti ad
esso, in quanto sara cancellato dalla base di dati
appena l’unita di lavoro sara completata
• un oggetto nello stato rimosso diventa disponibile per il
servizio di garbage collection al termine dell’unita di
lavoro
A. Poggi 107
Progetto di Applicazioni Software Anno accademico 2008-2009
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 109/124
Long-lived transactions
• richiamo: tra il momento in cui si leggono i dati dal DB
ed il momento in cui eventuali modifiche si rendono
persistenti puo trascorrere molto tempo
• si applica il pattern session-per-conversation: e
necessario disabilitare il flushing automatico chiamando
il metodo setFlushMode(FlushMode.MANUAL) quando
la sessione e aperta
A. Poggi 108
Progetto di Applicazioni Software Anno accademico 2008-2009
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 110/124
→ l’isolamento e garantito in quanto, abilitando il
locking ottimistico, le modifiche fatte in transazioni
concorrenti sono riconosciute
→ l’atomicita e garantita dal fatto che il flushing viene
eseguito solo al termine della transazione, e se la
sessione viene chiusa senza fare il flushing, la
transazione viene abortita
A. Poggi 109
Progetto di Applicazioni Software Anno accademico 2008-2009
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 111/124
Nota sui servizi che accedono direttamentealla base di dati
• come gia visto nell’approccio DAO, a volte e necessario
accedere direttamente alla base di dati per mezzo diquery SQL (senza passare dagli oggetti delle classi
mappate)
• il principale vantaggio che offre Hibernate e la
conversione automatica di un result set in oggetti dellabase di dati
A. Poggi 110
Progetto di Applicazioni Software Anno accademico 2008-2009
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 112/124
List result = session.
createSQLQuery("SELECT * FROM CATEGORY").addEntity(Category.Class).list();
→ Hibernate legge il result set e sulla base del file di
mapping definito per la classe Category, analizza le
colonne restituite: per ogni colonna restituita, verifica
se e mappata su di una proprieta della classe, e se lo e,
popola la suddetta proprieta e restituisce una lista di
oggetti caricati dalla base di dati
Attenzione: questo meccanismo funziona correttamente
solo se si usano delle query SQL “semplici” come
quella su specificata...
A. Poggi 111
Progetto di Applicazioni Software Anno accademico 2008-2009
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 113/124
Realizzare un livello dipersistenza generico
A. Poggi 112
Progetto di Applicazioni Software Anno accademico 2008-2009
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 114/124
Perche un livello di persistenza generico?
• permette di astrarre dalla tecnologia ORM usata e di
fornire un livello di astrazione maggiore, concentrato
sui servizi ad alto livello forniti dal livello di persistenza
• permette di nascondere al client l’implementazione
effettiva del livello di persistenza
• permette di far coesistere approcci misti all’ORM, i.e.
Hibernate e l’approccio DAO “hand-coded”
A. Poggi 113
Progetto di Applicazioni Software Anno accademico 2008-2009
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 115/124
Pattern DAO con interfacciamento generico
Il pattern di programmazione che useremo prevede ladefinzione di un’interfaccia che comprende tutte le
operazioni di persistenza di base (CRUD e metodi di
ricerca) necessarie per ogni classe persistente
A. Poggi 114
Progetto di Applicazioni Software Anno accademico 2008-2009
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 116/124
findById(ID id)
GenericItemDAO<Item,int>
CalcolaTempoResiduo()
GenericDAOHibernate<T,ID>
GenericDAOHibernate<T,ID>
GenericDAOHibernate<T,ID>
GenericDAOHibernate<T,ID>
GenericDAOHibernate<T,ID>
makePersistent()
makeTransient()
GenericUserDAO<Item,int>
GenericDAOMio<T,ID>
GenericDAO<T,ID>
A. Poggi 115
Progetto di Applicazioni Software Anno accademico 2008-2009
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 117/124
Generica super-interfaccia
Raggruppa tutte le operazioni CRUD di base condivise datutte le classi persistenti
public interface GenericDAO<T,ID extends Serializable> {
T findById(ID id);
T makePersistent(T class);
void makeTransient(T class);
}
Eventualmente, puo comprendere i metodi flush e clear.
A. Poggi 116
Progetto di Applicazioni Software Anno accademico 2008-2009
Generica implementazione con Hibernate
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 118/124
Generica implementazione con Hibernate
Una possibile implementazione della super-interfacciagenerica usa Hibernate, ovvero include proprieta specifichedi un livello di persistenza realizzato con Hibernatecondivise da tutte le classi la cui persistenza e realizzatacon Hibernate
public abstract class
GenericDAOHibernate<T,ID extends Serializable>
implements GenericDAO<T, ID estends Serializable> {
private Class<T> persistentClass;
private Session session;
public GenericDAOHibernate(){
this.persistentClass= (Class<T>)(ParameterizedType) getClass().getGenericSuperClass())
.getActualTypeArguments().[0];
}
A. Poggi 117
Progetto di Applicazioni Software Anno accademico 2008-2009
public void setSession (Session s) {
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 119/124
public void setSession (Session s) {
this.session = s;
}
protected Session openSession(){if (session==null)
session = HibernateUtil.getSessionFactory().
openSession();
return session;
}
protected Session getSession(){
if (session==null)
session = HibernateUtil.getSessionFactory().
getCurrentSession();
return session;
}
public Class<T> getPersistentClass(){
return persistentClass;
}
public T findById(ID is) {
T class = (T) getSession.load(getPersistentClass(),id);
A. Poggi 118
Progetto di Applicazioni Software Anno accademico 2008-2009
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 120/124
return class;
}public T makePersistent(T class) {
getSession.saveOrUpdate(class);
return class;
}
public void makeTransient(T class) {
getSession.delete(class);}
public void flush() {
getSession.flush();
}
public void clear() {
getSession.clear();}
}
A. Poggi 119
Progetto di Applicazioni Software Anno accademico 2008-2009
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 121/124
Interfacciamento specifico delle classipersistenti
Per ogni classe persistente, si definisce una sotto-interfaccia
che comprende i metodi specifici della classepublic interface ItemDAO
extends GenericDAO<Item,int> {
int CalcolaTempoResiduo();
}
A. Poggi 120
Progetto di Applicazioni Software Anno accademico 2008-2009
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 122/124
Implementazione di classi persistenti con
Hibernate
Rimangono da definire le sottoclassi dell’implementazionegenerica con Hibernate, che implementano l’interfacciaspecifica di ogni classe persistente
public class ItemDAOHibernate
extends GenericDAOHibernate<Item, int>
implements ItemDAO {
public int CalcolaTempoResiduo(){
(...)}
}
A. Poggi 121
Progetto di Applicazioni Software Anno accademico 2008-2009
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 123/124
Nota
Per realizzare un’implementazione che segue l’approccio
DAO “hand-coded” e necassario allo stesso modo, definire
un’implementazione generica e una sua sottoclasse per ogni
classe persistente
→ cf. lezione sull’approccio DAO all’ORM
A. Poggi 122
Progetto di Applicazioni Software Anno accademico 2008-2009
7/16/2019 Hibernate
http://slidepdf.com/reader/full/hibernate-563387c45570e 124/124
Esempio di uso del livello di persistenza
Quando si deve creare un oggetto della classe persistente, enecessario fare riferimento all’implementazione usata
ItemDAO itemDAO = new ItemDAOHibernate();
UserDAO userDAO =new UserDAOMio();
Item item = itemDAO.findById(itemId);
(...)
}