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