Hibernate - MAPPING
I mappaggi oggetto/relazione vengono definiti in un documento XML. Il documento di mappaggio è progettato per essere leggibile e modificabile a mano. Il linguaggio di mappaggio è java-centrico, nel senso che i mappaggi sono costruiti intorno alle dichiarazioni delle classi persistenti, non sulle dichiarazioni delle tabelle.
Esistono un certo numero di strumenti per generare il documento di mappaggio, tra cui XDoclet, Middlegen e AndroMDA, ma è anche possibile generare i documenti di mappaggio senza utilizzare nessun strumento specifico, ma utilizzando un semplice editor di testo.
Un esempio di mappaggio definito sull’oggetto precedentemente definito è il seguente:
<!-- qui potrebbe stare il mappaggio per Dog -->Di seguito verranno descritti solo gli elementi e gli attributi del documento che Hibernate usa in fase di esecuzione. Il documento di mappaggio contiene anche alcuni elementi ed attributi opzionali che hanno effetto sugli schemi del database exportati dallo strumento di generazione dello schema (schemaexport). (Ad esempio l’attributo not-null.)
- Doctype: indica l’effettivo DTD utilizzato che si trova all’URL indicato, nella directory hibernate-x.x.x/src/net/sf/hibernate del pacchetto di Hibernate o nel file hibernate.jar. Hibernate cercherà sempre per prima cosa il DTD sul classpath.
- Hibernate-Mapping: questo elemento ha tre attributi opzionali: l’attributo schema specifica che le tabelle a cui si fa riferimento nel mappaggio appartengono allo schema indicato. L’attributo default-cascade che specifica quale stile di cascata dovrebbe essere assunto e l’attributo auto-import che consente di utilizzare nomi di classe non qualificati nel linguaggio di interrogazione come comportamento predefinito.
- Class: è l’elemento che si utilizza per dichiarare una classe persistente. L’elemento è formato da diversi attributi, che sono: name che indica il nome di classe java completamente qualificato della classe persistente (o l’interfaccia); table che indica il nome della sua tabella di database; discriminator-value (opzionale - il default è il nome della classe) indica un valore che distingue sottoclassi individuali, usato per il comportamento polimorfico.
I valori accettabili includono null e not null; mutable (opzionale, il default è true) specifica che le istanze della classe (non) sono mutabili; schema (opzionale) serve per sovrascrive il nome dello schema specificato dall’elemento radice ; proxy (opzionale) specifica una interfaccia da usare per i mediatori (proxy) ad inizializzazione ritardata; dynamic-update (opzionale, il default è false) specifica che una UPDATE SQL dovrebbe venire generata in fase di esecuzione e contenere solo i nomi delle colonne di cui sono cambiati i valori; dynamic-insert (opzionale, il default è false) specifica che le INSERT SQL dovrebbero venire generate in fase di esecuzione e contenere solo i nomi delle colonne i cui valori sono non nulli; select-before-update (opzionale, il default è false):
specifica che Hibernate non dovrebbe mai eseguire una UPDATE a meno che non sia certo che un oggetto non sia davvero stato modificato.
In certi casi (in realtà solo quando un oggetto transiente sia stato associato ad una nuova sessione usando update()), questo significa che Hibernate effettuerà una istruzione SQL SELECT in più per determinare se UPDATE sia realmente richiesto; where (opzionale) specifica una condizione WHERE dell’SQL arbitraria da usare quando si recuperano oggetti di questa classe; persister (opzionale): specifica un ClassPersister personalizzato; batch-size (opzionale, il default è 1) specifica una “dimensione di blocco” (batch) per il caricamento di istanze di questa classe per identificatore; optimistic-lock (opzionale, il default è version) determina la strategia di locking ottimistico;
lazy (opzionale):
impostare lazy=”true” è una scorciatoia equivalente a specificare il nome stesso della classe come interfaccia proxy;
- Id: Le classi mappate devono dichiarare la colonna di chiave primaria della tabella sul database. La maggior parte delle classi avrà anche una proprietà nello stile dei javabean (cioè con metodi “getter” e “setter”) che manterrà l’identificatore unico di un’istanza. L’elemento definisce il mappaggio da quella proprietà alla colonna di chiave primaria. Gli attributi dell’elemento sono: name (opzionale) che indica il nome della proprietà identificatore; type (opzionale) che indica il tipo di Hibernate; column (opzionale - il default è il nome della proprietà)che specifica il nome della colonna di chiave primaria; unsaved-value (opzionale - il default è null) che è un valore di proprietà di identificazione che indica che un’istanza è appena stata istanziata (è “unsaved”), distinguendola da istanze che siano state salvate o caricate in una sessione precedente; access (opzionale - il default è property) che specifica la strategia che Hibernate dovrebbe usare per accedere al valore della proprietà. L’elemento figlio obbligatorio indica una classe Java utilizzata per generare identificatori unici per istanze di questa classe persistente. Se l’istanza del generatore richiedesse di essere configurata o inizializzata con dei parametri, questi possono essere passati usando l’elemento generator indica una classe Java utilizzata per generare identificatori unici per istanze di questa classe persistente. Se l’istanza del generatore richiedesse di essere configurata o inizializzata con dei parametri, questi possono essere passati usando l’elemento. Hibernate fornisce un certo numero di implementazioni preinstallate. Ci sono anche dei nomi abbreviati per i generatori preinstallati ad es. increment ( genera identificatori di tipo long, short o int che sono unici solo quando nessun altro processo inserisce dati nella stessa tabella), identity (supporta le colonne “identity” in DB2, MySQL, MS SQL Server, Sybase e HypersonicSQL), sequence (usa una “sequence” in DB2, PostgreSQL, Oracle, l’identificatore restituito è di tipo long, short o int.), hilo (usa un algoritmo hi/lo per generare efficientemente identificatori di tipo long, short o int, date una tabella e una colonna) ecc..
L’algoritmo Hilo
I generatori hilo e seqhilo forniscono due implementazioni alternative dell’algoritmo hi/lo, un approccio importante per la generazione di identificatori. La prima implementazione richiede una tabella “speciale” del database per mantenere il prossimo valore “hi” disponibile. La seconda usa una “sequence” nello stile di Oracle (dove sia supportata).
L’algoritmo UUID
Gli UUIDs contengono: indirizzo IP, tempo di partenza della JVM (accurato al quarto di secondo), il tempo di sistema e il valore di un contatore (unico all’interno della JVM).
Non è possibile ottenere un indirizzo MAC o un indirizzo di memoria da del codice java, quindi questo è il massimo che possiamo fare senza usare JNI.
- L”elemento version è opzionale, e indica che la tabella contiene dati versionati. È particolarmente utile se progettate di usare transazioni lunghe
- L’elemento opzionale timestamp indica che la tabella contiene dati con marche di tempo
- L’elemento property dichiara una proprietà persistente in stile JavaBeans della classe, possiede gli attributi name (nome della proprietà), column (il nome della colonna mappata della tabella del database), type (tipo di Hibernate), insert/update (specifica che le colonne mappate dovrebbero essere incluse in istruzioni SQL UPDATE e/o INSERT),formula (opzionale, indica una espressione SQL che definisce il valore per una proprietà), access (opzionale, indica la strategia che Hibernate deve usare per accedere al valore della proprietà).
