Hibernate
Type system
Dott. Doria Mauro
[email protected]
[email protected]
Hibernate built-in types
Quando si configura un proprietà si può specificare il tipo.
<property name="email“ column="EMAIL“ type="string"/>
2
Mentre i tipi di Java sono fissati, i tipi del DB possono variare a
seconda del DBMS scelto
Il tipo specificato nella proprietà type è quindi un tipo di Hibernate
che fa da ponte tra la proprietà Java e il tipo della colonna
Hibernate mette a disposizione dei propri tipi a questo scopo.
Questi prendono il nome di built-in types.
Hibernate definisce, inoltre, la strategia di mapping tra i tipi
primitivi Java ed anche per alcune delle classi del JDK
[email protected]
Java primitive mapping types
3
I DBMS di
solito
propongono
un loro
sistema di tipi
spesso
ignorando lo
standard e
quindi la
colonna di
destra
potrebbe
contenere dei
tipi diversi da
quelli reali.
[email protected]
Java primitive mapping types
4
Hibernate, in base al dialetto, è in grado di mappare i tipi Java con i tipi
specifici di un certo DB
Hibernate possiede, inoltre, un mapping intelligente in grado di
individuare il tipo giusto (sempre per un certo DBMS) in base alla
lunghezza di un valore.
Ad esempio, in MySQL definendo una proprietà di tipo string fino a
65535, questa verrà mappata come un normale VARCHAR(length),
mentre per lunghezze fino a 16777215 verrà mappata con un
MEDIUMTEXT. Per quelle ancora più grandi LONGTEXT.
Per customizzare questo comportamento è possibile creare una
sottoclasse della classe dialetto e ridefinire i metodi set che si occupano
del mapping.
[email protected]
Java Date e time mapping types
5
Le date sono un tipo fondamentale sui DB. Hibernate utilizza le
apposite classi di JDBC (package sql) oppure le classi di
supporto del package util.
NOTA: alcuni tipi come il timestamp sono mappati con 2 diversi tipi Java. Dichiarando
una proprietà di tipo java.util.Date per una colonna timestamp, Hibernate potrebbe
tornare un oggettojava.sql.Timestamp in quanto non può ignorare i nanosecondi. Per
evitare questo problema, creare un mapping (a mano) nel metodo set.
[email protected]
Java binary and large value
6
Infine, Hibernate propone dei tipi per gli oggetti binary e di grandi
dimensioni.
NOTA: considerato che Hibernate inizializza i valori delle proprietà quando l’istanza
viene caricata, questo potrebbe essere inefficiente per gli oggetti di grandi dimensioni.
In questo caso è opportuno valutare l’uso di un intercettore per modificare tale
comportamento e adottare il “lazy loading”.
[email protected]
Java JDK mapping types
7
Vi sono poi altri tipi di Java mappati da Hibernate, come i
seguenti:
[email protected]
Utilizzare i tipi di Hibernate
Molti dei tag di Hibernate utilizzano l’ attributo type.
I tag <id>, <property>, <version>, <discriminator>, <index> e
<element> definiscono un attributo type. Ad esempio:
<class name="BillingDetails" table="BILLING_DETAILS">
<id name="id" type="long" column="BILLING_DETAILS_ID">
<generator class="native"/>
</id>
<discriminator type="character" column="BILLING_DETAILS_TYPE"/>
<property name="number" type="string"/>
....
</class>
8
E’ inoltre possibile omettere l’attributo type lasciando che
Hibernate determini (tramite la reflection) il giusto tipo.
Nota: questo non funziona bene con le date, dove è sempre opportuno indicare il tipo
che si vuole utilizzare
[email protected]
Mappare le Enumeration
Hibernate è in grado di mappare oggetti di tipo enumeration
Supponiamo di avere la seguente
classe Rating di tipo
Enumeration e la classe Comment che la usa.
package auction.model;
public enum Rating {
EXCELLENT, OK, BAD
}
public class Comment {
private Rating rating;
private Item auction;
...
}
L’istruzione che costruire un oggetto Comment sarebbe:
Comment goodComment = new Comment(Rating.EXCELLENT, thisAuction);
9
A questo punto, come rendere persistente un oggetto Comment?
–
Il mapping si può fare sia con un campo VARCHAR che con un
custom-type
[email protected]
Domande?
DECIMAL
int
string
Enumeration
double
10
CLOB e BLOB
Date
Locale
Currency