Introduzione a Hibernate

Embed Size (px)

DESCRIPTION

JJ — n. 4 — settembre-ottobre 2007Introduzione a Hibernatedi Marco Pancotti Scrivere un breve testo su Hibernate e tutt’altro che facile, in quanto il prodotto e estremamente ricco di funzionalita e di caratteristiche, ognuna delle quali meriterebbe un approfondimento a se.pubblicato su www.infomedia.it

Citation preview

JJ n. 4 settembre-ottobre 2007

Introduzione a Hibernatedi Marco Pancotti` ` Scrivere un breve testo su Hibernate e tuttaltro che facile, in quanto il prodotto e estrema` mente ricco di funzionalita e di caratteristiche, ognuna delle quali meriterebbe un approfon` dimento a se.

Marco Pancotti Marco Pancotti ha iniziato la sua carriera nel 1982, in una delle ` maggiori societa internazionali di Business Consulting. Dopo aver ` diretto una societa di software ha cominciato, a partire dai primi anni 90, ad operare come consulente direzionale ` in ambito IT. E autore di una metodologia per la ` certicazione di qualita del software basata sullapplicazione della norma ISO 9126 e di un metodo di valutazione ` della qualita di siti Web ` orientati alleBusiness. E membro del Comitato Tecnico OASIS per la denizione dello standard UBL e realizza applicazioni basate sugli standard ebXML/UBL.

pubblicato su WWW.INFOMEDIA.IT stampa digitale da Lulu Enterprises Inc. stores.lulu.com/infomediaInfomedia` Infomedia e limpresa editoriale che da quasi venti anni ha raccolto la voce dei programmatori, dei sistemisti, dei professionisti, degli studenti, dei ricercatori e dei professori dinformatica italiani. Sono pi` di 800 gli autori che hanno realizzato per le teu state Computer Programming, Dev, Login, Visual Basic Journal e Java Journal, molte migliaia di articoli tecnici, presentazioni di prodotti, tecnologie, protocolli, strumenti di lavoro, tecniche di sviluppo e semplici trucchi e stratagemmi. Oltre 6 milioni di copie distribuite, trentamila pagine stampate, fanno di questa impresa la pi` grande ed u inuente realt` delleditoria specializzata nel campo della a programmazione e della sistemistica. In tutti questi anni le riviste Infomedia hanno vissuto della passione di quanti vedono nella programmazione non solo la propria professione ma unattivit` vitale e un vero a divertimento. ` Nel 2009, Infomedia e cambiata radicalmente adottando ` un nuovo modello aziendale ed editoriale e si e organizzata attorno ad una idea di Impresa Sociale di Comunit` , a partecipata da programmatori e sistemisti, separando le attivit` di gestione dellinformazione gestite da un board a comunitario professionale e quelle di produzione gesti` te da una impresa strumentale. Questo assetto e in linea con le migliori esperienze internazionali e rende Infomedia ancora di pi` parte della Comunit` nazionale degli u a sviluppatori di software. ` Infomedia e media-partner di manifestazioni ed eventi in ambito informatico, collabora con molti dei pi` imporu tanti editori informatici italiani come partner editoriale e fornitore di servizi di localizzazione in italiano di testi in lingua inglese.

Limpaginazione automatica di questa rivista e realizzata al ` 100% con strumenti Open Source usando OpenOffice, Emacs, BHL, LaTeX, Gimp, Inkscape e i linguaggi Lisp, Python e BASH

For copyright information about the contents of Java Journal, please see the section Copyright at the end of each article if exists, otherwise ask authors. Infomedia contents is 2007 Infomedia and released as Creative Commons 2.5 BY-NC-ND. Turing Club content is 2007 Turing Club released as Creative Commons 2.5 BY-ND. Le informazioni di copyright sul contenuto di Java Journal sono riportate nella sezione Copyright alla ne di ciascun articolo o vanno richieste direttamente agli autori. Il contenuto Infomedia e 2007 Infomedia e rila` sciato con Licenza Creative Commons 2.5 BY-NC-ND. Il contenuto Turing Club e 2007 Turing Club e rilasciato ` con Licenza Creative Commons 2.5 BY-ND. Si applicano tutte le norme di tutela dei marchi e dei segni distintivi. ` E in ogni caso ammessa la riproduzione parziale o totale dei testi e delle immagini per scopo didattico purch e vengano integralmente citati gli autori e la completa identicazione della testata. Manoscritti e foto originali, anche se non pubblicati, non si restituiscono. Contenuto pubblicitario inferiore al 45%. La biograa dellautore riportata nellarticolo e sul sito www.infomedia.it e di norma quella disponibi` le nella stampa dellarticolo o aggiornata a cura dellautore stesso. Per aggiornarla scrivere a [email protected] o farlo in autonomia allindirizzo http://mags.programmers.net/moduli/biograa

speciale Object/Relational Mapping

JAVA Journal

Introduzione a HibernateScrivere un breve testo su Hibernate tuttaltro che facile, in quanto il prodotto estremamente ricco di funzionalit e di caratteristiche, ognuna delle quali meriterebbe un approfondimento a s.

>> di Marco Pancotti ([email protected])

Q

uesto articolo una introduzione a volo di rondine su ci che Hibernate pu offrire a chi sviluppa applicazioni Java in cui la persistenza degli oggetti un elemento determinante. Seguiranno, nei prossimi numeri di Java Journal, una serie di articoli in cui, passo dopo passo, si vedr, in dettaglio, come installare Hibernate, come utilizzarlo per mappare dei Domain Model complessi e come ottimizzarne le prestazioni.

ORM produce SQL sulla base di metadati associati alla classe da rendere persistente. Hibernate richiede un certo sforzo di apprendimento, in quanto affronta un tema complesso in modo professionale. Le ottimizzazioni possibili sia in lettura sia in scrittura, luso di Annotation proprietarie che possono affiancare quelle proprie dello standard JPA, la disponibilit di cinque diverse possibilit di accesso ai dati, luso di tecniche di caching e la presenza di opzioni specifiche per il supporto alle applicazioni Web fanno di Hibernate un prodotto sofisticato, che richiede, per poter essere sfruttato appieno, un certo studio. Hibernate ha una flessibilit tale da poter essere utilizzato sia in un contesto in cui si pu disegnare il modello dati partendo dal modello ad oggetti, sia in un contesto in cui si deve fare i conti con un modello dati preesistente. Lo scenario ideale per limpiego di Hibernate comunque quello in cui un articolato Domain Model, ricco di classi e di associazioni tra classi, deve essere reso persistente in totale indipendenza rispetto al database utilizzato, al contesto tecnologico (sistema operativo, network, ecc.) e allinterfaccia di accesso ai dati (Web classico, RIA, Swing o nuovi ambienti come Flex, Silverlight o JavaFX). Per semplici applicazioni, dove non vi necessit di supportare diversi database e dove si deve gestire una manciata di classi persistenti, probabile che Hibernate rappresenti un mezzo suicidio e che una soluzione basata su JDBC possa risultare pi adeguata.

Il problema del mapping Object/Relational Il problema della mappatura oggetto/relazione un tema vasto ed interessante, ma trascende lo scopo di questo primo articolo, che vuole invece concentrarsi sulla soluzione che Hibernate propone. Per questo motivo in questo contesto ci limitiamo ad osservare che: Hibernate un vero e proprio O/R Mapper, non un wrapper (com ad esempio Rails), o un Data Mapper (come Ibatis). Le differenze sono sottili ma importanti. Un wrapper, ad esempio, richiede che la progettazione avvenga in termini di modello relazionale e che il Domain Model sia derivato dal data model, mentre un ORM permette un disegno ad oggetti indipendente da cui si in grado successivamente di derivare, in modo automatico, il modello relazionale ideale. Un Data Mapper, invece, richiede che laccesso al database venga specificato in termini di codice SQL, mentre un

8

n.4 - settembre/ottobre 2007

JAVA JournalLa soluzione Hibernate al problema del mapping O/R Hibernate un tool open source per il mapping object/ relational il cui intendimento garantire agli utilizzatori benefici in termini di produttivit, manutenibilit, prestazioni e indipendenza dal produttore del RDBMS. Hibernate nato dallo sforzo di Gavin King, ben presto supportato da Christian Bauer e da altri sviluppatori. Nel 2005 JBoss ha acquisito i diritti su Hibernate ed ha ingaggiato i principali membri del gruppo di lavoro. Oggi Hibernate, in seguito allacquisizione da parte di JBoss, fa parte dellofferta di RedHat, anche se il gruppo di sviluppo ha mantenuto una totale indipendenza in termini di licencing, disponibilit e supporto. Hibernate si posiziona al top dellofferta nellambito degli strumenti per la gestione della Java Persistence. Il gruppo di sviluppo Hibernate ha partecipato alla definizione dello standard EJB 3.0 influenzandone in modo evidente le scelte, pur mantenendo soluzioni di mapping e di tuning proprietarie che permettono un superamento dei limiti imposti dalla stretta aderenza agli standard JPA. Hibernate nato come tool Java, ma ne stata sviluppata una versione per lambiente .NET, denominata NHibernate. La release 1.2 di NHibernate, disponibile dai primi di Maggio del 2007, comprende caratteristiche che attestano NHibernate molto vicino ad Hibernate per Java.

Object/Relational Mapping speciale

file di configurazione dal nome hibernate.cfg.xml. La configurazione riportata qui di seguito la pi semplice possibile: com.mysql.jdbc.Driver jdbc:mysql://localhost/jjhtut myname mypass org.hibernate.dialect. MySQLDialect

Configurare unapplicazione basata su Hibernate La configurazione di unapplicazione in cui si vuole utilizzare Hibernate piuttosto semplice. Il classpath dellapplicazione deve includere una serie di file jar, tra cui i principali inclusi nei package Hibernate Core e Hibernate Annotations scaricabili dal sito Hibernate, che sono: hibernate3.jar hibernate-annotations.jar ejb3-persistence.jar hibernate-commons-annotations.jar

Hibernate un toolopen source per il mapping object/relational

Oltre ai jar principali, necessario che il classpath comprenda anche una serie di dipendenze, che sono: antlr.jar asm.jar asm-attrs.jar c3p0.jar cglib.jar commons-collections.jar commons-logging.jar dom4j.jar jta.jar

In altre parole, la precedente configurazione dichiara che: per la connessione utilizzato il driver JDBC MySql il database a cui si connessi sotto localhost e si chiama jjhtut le credenziali di accesso sono myname con password mypass il dialetto da utilizzare nella creazione delle istruzioni SQL quello di MySql le classi Java mappate sul database sono org.jjh.Person e org.jjh.Organization

Tutti i jar citati sono reperibili nella directory lib di Hibernate Core. Se si utilizza lIDE Eclipse conveniente scaricare ed installare anche il plugin compreso in Hibernate Tools. Una volta impostato il classpath necessario che in corrispondenza della root della propria applicazione sia definito un

Il file di configurazione pu essere arricchito di diversi altri parametri. Interessanti, tra gli altri, sono quelli che permettono di creare o aggiornare automaticamente il database sulla base del mapping; quelli che permettono di visualizzare in console il codice SQL generato automaticamente da Hibernate quando esegue i comandi; e quelli destinati alla configurazione di pool di connessioni JDBC e

n.4 - settembre/ottobre 2007

9

speciale Object/Relational Mapping

JAVA JournalSQL che viene generato, molte delle Annotation proprietarie sono dedicate ad un tuning che ha, come conseguenza, la generazione di un SQL pi conforme ai desideri dello sviluppatore. Questa attivit di tuning pu riguardare, tra laltro: il contenuto del codice SQL generato e lopportunit di eseguire o meno le istruzioni di UPDATE in determinate circostanze; il tipo di lock ottimistico da implementare nella gestione degli aggiornamenti; limpiego di speciali istruzioni WHERE nelle letture; il comportamento a cascata nel caso di cancellazione di una entit padre rispetto alle entit associate; la gestione di indici legati ad una o pi propriet; ladozione di codice utente per la persistenza di una entit diverso da quello normalmente adottato da Hibernate (ad esempio per utilizzare stored procedure, LDAP o altri approcci); lutilizzo di uno dei generatori di chiavi primarie messi a disposizione da Hibernate nel caso il database utilizzato non ne fornisca uno adeguato; ladozione di formule per calcolare valori come se fossero campi virtuali; lutilizzo di UserType, cio di tipi definiti dallutente che richiedono particolari accorgimenti nel gestire la loro persistenza.

della cache. Terminato il setup di base, si pu cominciare a definire il mapping.

Uso delle Annotation per la mappatura del modello a classi su un DB relazionale Hibernate, nei suoi primi anni di vita, ha utilizzato un metodo di mapping basato su file di configurazione XML. Questo metodo, peraltro tuttora pienamente supportato, stato affiancato, a partire dalla disponibilit di Java 5, dal mapping basato su Annotations. Le Annotation utilizzate da Hibernate sono quelle definite allinterno dello standard JSR 220 (Java Persistence API, o JPA) arricchite da una serie di Annotation proprietarie, che sono spesso utili, se non indispensabili, per ottenere il massimo dal proprio database. Chi volesse rimanere aderente allo standard JPA dovrebbe limitarsi ad usare le Annotation standard; ma il nostro consiglio, se si vuole sfruttare appieno Hibernate, di studiare con attenzione anche le estensioni, anche perch probabile che presto entrino a far parte dello standard stesso. Poich in questo speciale ORM vi un articolo specificamente dedicato allo standard JPA, non ripeteremo qui la spiegazione del significato di Annotation come @Entity, @Id, @Column e via dicendo, perfettamente corrispondenti a quanto previsto dallo standard. Nel codice che segue, in ogni caso, si pu vedere un semplicissimo mapping Hibernate definito tramite Annotation.@Entity public class Flight implements Serializable { Long id; String destination; @Id public Long getId() { return id; } public void setId(Long id) { this.id = id; } @Column(length=50) Public getDestination(){Return destination;} Public void setDestination(destination) { this.destination=destination;) }

Sono disponibili molte altre Annotation specifiche di Hibernate, troppe per essere citate integralmente in questo articolo. La loro presenza permette allo sviluppatore un controllo molto elevato del tool Hibernate, quando ci richiesto, evitando la frustrazione tipica di chi si affidato ad uno strumento nella speranza di guadagnare in semplicit e rapidit di sviluppo per poi scoprire di dover subire limitazioni inaccettabili in termini di funzionalit e prestazioni.

La gestione delle transazioni Utilizzando Hibernate, la problematica della gestione delle transazioni pu essere affrontata in due modi: includere il controllo della transazione allinterno del proprio codice, esplicitando cos dove inizia e dove finisce una transazione, per quali eccezioni eseguire le catch e per quali rimandare allo strato software superiore; delegare il controllo della transazione ad un container, magari basato su Spring o su EJB3. In questo caso, il proprio codice si limita ad eseguire listruzione di accesso al database, mentre il container controlla la transazione e ne gestisce le eccezioni.

Ricordiamo invece che un ORM come Hibernate genera automaticamente le istruzioni SQL necessarie per eseguire le letture e le scritture delle classi rese persistenti. Nel codice Java, di conseguenza, ci si limiter ad eseguire semplici istruzioni comeget(Class, id)

osave(object)

mentre la loro trasformazione nelle istruzioni SELECT o UPDATE delegata ad Hibernate. Per evitare che lo sviluppatore perda completamente il controllo del codice

In apparenza, il secondo metodo appare pi sofisticato: ma non dimentichiamo che esiste una scuola di pensiero per cui il cuore della logica di unapplicazione gestionale sta proprio nel controllo delle transazioni. Per chi di questa opinione il primo metodo lunico da seguire. Hibernate, come tutti gli ORM aderenti allo standard JPA,

10

n.4 - settembre/ottobre 2007

JAVA Journalpermette di implementare un locking ottimistico basato sul versioning o sul timestamp. Nel primo caso Hibernate, ad ogni UPDATE, incrementa automaticamente una propriet numerica identificata dallAnnotation @Version. Nel secondo caso la propriet invece di tipo Timestamp e laggiornamento consiste nella memorizzazione dellistante in cui avvenuto lUPDATE.

Object/Relational Mapping speciale

Processo: riguarda i dati condivisibili da pi transazioni, anche in modo concorrente, ma allinterno di una singola macchina; Cluster: riguarda i dati condivisibili tra pi transazioni potenzialmente situate su diverse macchine connesse tra loro in rete.

Lottimizzazione delle prestazioni Hibernate dotato di una ricca serie di opzioni destinate a garantire elevate prestazioni alle applicazioni che lo utilizzano per la gestione della persistenza.

Hibernate si posizionaal top dellofferta nellambito degli strumenti per la gestione della Java Persistence

La strategia di fetch e la possibilit di tuning della stessa Una prima serie di opzioni dedicata alla possibilit di definire in dettaglio quando e come unentit, e le entit ad essa associate, sono lette dal database. Si tratta di un punto critico nellutilizzo di un ORM, in quanto il codice utente si limita, tramite unistruzioneget(Class, id)

oload(Class, id)

a dichiarare cosa vuole leggere; mentre la traduzione di questa lettura in termini SQL delegata allORM stesso. La criticit emerge in modo prepotente quando la classe target piena di associazioni ad altre classi, siano esse relazioni molti a uno (ManyToOne) sia uno a molti (OneToMany). Un cattivo disegno del mapping, in questi casi, pu far decadere in modo irrimediabile le prestazioni, facendo rimpiangere una classica soluzione JDBC. Con Hibernate non si corre questo pericolo, in quanto luso adeguato delle sue parametrizzazioni, tutte esplicitabili tramite Annotation, permette un forte controllo del codice SQL generato. Nei casi pi critici sempre possibile richiedere che una particolare lettura sia effettuata utilizzando un codice SQL scritto a mano o tramite lutilizzo di una stored procedure.

Il caching Uno dei motivi per cui si possono preferire le soluzioni ORM rispetto al semplice uso di JDBC che le prime permettono di implementare una strategia di caching dei dati, trasparente allapplicazione ma in grado di minimizzare laccesso al database manager. Il caching pu essere realizzato a tre livelli: Transazionale: riguarda i dati propri della transazione o del gruppo di transazioni (conversation) in corso; laccesso a questa cache non pu essere concorrente;

Il caching sfugge alle standardizzazioni JPA o EJB, per cui ogni fornitore di interfacce di persistenza propone la propria soluzione. Hibernate implementa una sofisticata architettura di caching a due livelli. Il primo livello di caching predefinito e si occupa del caching transazionale. Il secondo livello di cache configurabile come cache di processo o di cluster. Questa cache pluggable ( possibile decidere se e come attivarla), pu fare riferimento ad una o pi classi persistenti, ed configurabile in funzione del fatto che ci si aspetti unattivit transazionale pi o meno frequente sulla classe messa in cache e del fatto che si voglia garantire un livello pi o meno alto di isolamento agli oggetti presenti in cache. La cache di secondo livello pu essere implementata, a scelta dellutente, usando uno dei vari prodotti supportati da Hibernate (dal pi semplice EHCache fino al sofisticato JBoss Cache passando da OSCache e SwarmCache). La configurazione della cache pu essere pilotata da apposite Annotation proprietarie di Hibernate, unite, quando necessario, alla configurazione del prodotto utilizzato. Una corretta configurazione della cache, insieme ad una strategia di dimensionamento e di alimentazione preventiva della stessa allavvio dellapplicazione, pu condurre a significativi incrementi di performance e di scalabilit di unapplicazione Hibernate, soprattutto in ambito Web.

La flessibilit nella scelta della strategia di accesso ai dati Hibernate propone un ampio ventaglio di possibilit di accesso ai dati persistenti.

n.4 - settembre/ottobre 2007

11

speciale Object/Relational Mapping

JAVA Journalsi deve far carico del problema della correttezza del codice generato, cos come degli eventuali problemi di portabilit su altri database.

HQL e JPA QL Il primo metodo si chiama HQL (Hibernate Query Language) che unestensione del linguaggio standard JPA denominato QL. Una tipica istruzione HQL del tipo:from Person as p where p.name=Marco

Hibernate nelle applicazioni Web Unapplicazione Web moderna, soprattutto in un contesto Java, normalmente disegnata a pi livelli. Il layer pi basso, quello della persistenza, il regno di Hibernate. Il layer Persistenza basato su Hibernate normalmente composto da: Un Domain Model adeguatamente annotato Un DAO base, riutilizzato in pi punti dellapplicativo per i pi semplici comandi di lettura e aggiornamento dei dati Da DAO specifici, che implementano istruzioni di ricerca e gestione per le classi pi complesse, che richiedono strategie particolari di query o di aggiornamento dei dati.

Come si pu osservare, vi una forte somiglianza con SQL, anche se ci si riferisce a classi e propriet e non a tabelle e campi. Un uso professionale di HQL permette di ottenere tutto ci che, normalmente, si chiede a SQL, con il vantaggio di ricevere in output liste di oggetti immediatamente utilizzabili nel proprio codice Java, e non dei semplici ResultSet.

Query by Criteria Capita spesso, che in un applicativo si debba costruire una query al volo, sulla base dello stato corrente, in quanto si desidera poter decidere a runtime che cosa ricercare, e sulla base di quali criteri di selezione. Per fare questo si potrebbe delegare al codice Java la creazione della stringa di ricerca concatenando le stringhe from, where, and e via dicendo, per ottenere un comando adatto alla ricerca che si vuole effettuare. Questo metodo per scomodo e poco adatto alla programmazione ad oggetti. Per ovviare a questo limite, Hibernate mette a disposizione uninterfaccia Java che permette di definire una query creando degli oggetti di tipo Criteria allinterno dei quali possibile, sempre in modo dinamico, specificare i dettagli dellinterrogazione da creare. Bench luso di questa tecnica sia pi raro rispetto alluso di HQL, la presenza delle Query by Criteria pu risultare molto comoda in determinate circostanze.

I DAO (che altro non sono che degli insiemi di metodi per laccesso al database), siano essi standard o specifici, sono poi utilizzati dallo strato superiore del software, normalmente denominato layer Servizi. Il layer Servizi implementa gli use case di gestione del database attivati dalla GUI o dalle applicazioni di tipo batch. Uno use case di inserimento di un ordine cliente, ad esempio, pu essere gestito da una classe di tipo service denominata OrderFulfillment che, a sua volta, utilizza un OrderDAO, un CustomerDAO, un PaymentDAO, ecc. Luso di questa architettura permette di concepire, sviluppare ed implementare dei Domain Model persistenti fortemente indipendenti dal software sottostante (database manager, sistema operativo, rete, ecc.) e da quello sovrastante (GUI, layer Servizi, ecc.), che siano di facile documentazione e manutenzione.

Query by Example Le Query by Exemple sono molto simili alle Quey by Criteria, ma il dettaglio dellinterrogazione specificato utilizzando delle classi che contengono degli esempi dei dati da utilizzare come filtri di ricerca. Lesecuzione della ricerca ritorna, come risultato, gli oggetti della stessa classe compatibili con lesempio fornito. evidente che questa possibilit pu essere preziosa nelle classiche ricerche libere dove lutente deve compilare uno schermo da usare come template per uninterrogazione complessa. Il test di applicazioni basate su Hibernate Il test dello strato di persistenza basato su Hibernate molto pi semplice rispetto a quello che normalmente si progetta per applicazioni non basate su un ORM. Luso delle Annotation, infatti, rende inutile la verifica della consistenza tra classe Java e tabella usata per la persistenza. Allo stesso tempo la correttezza del codice SQL utilizzato per laccesso al database garantito da Hibernate stesso e non richiede ulteriori attenzioni. Il test si concentra quindi, nella maggioranza dei casi, sulla verifica delle prestazioni e della scalabilit dellapplicazione, alla ricerca di eventuali problemi risolvibili tramite lottimizzazione delle Annotation o la semplificazione del modello.

SQL nativo Vi sono casi, per quanto rari, in cui tutte le possibilit offerte da Hibernate per il tuning delle query si rivelano insufficienti rispetto allobiettivo che si vuole ottenere. In questo caso il tool permette di creare una query utilizzando istruzioni SQL native, anche proprie del dialetto SQL implementato dal DBMS di riferimento. Ovviamente, quando decide di usare SQL nativo, lutente

Luso di Hibernate con database gi configurati (legacy) Hibernate sviluppa tutta la sua potenza quando si pu partire da un Domain Model concepito solo in funzione del-

12

n.4 - settembre/ottobre 2007

JAVA Journalla sua rappresentativit del problema affrontato, senza preoccupazioni legate al data model. Nella realt, purtroppo, si deve spesso fare i conti con modelli dati preesistenti, da utilizzare allinterno della propria applicazione, senza una reale possibilit di cambiamento. Hibernate in grado di essere utile anche in questa circostanza, in quanto il suo sistema di Annotation pu descrivere anche le situazioni pi complesse, garantendo il mapping richiesto tra un database legacy e il proprio modello ad oggetti.

Object/Relational Mapping speciale

le progettare linterfaccia utente in termini di Conversation (sequenza di richieste logicamente collegate tra loro). Seam si colloca in un contesto EJB3 arricchendolo di funzionalit destinate alla semplificazione della scrittura di GUI Web.

Conclusioni Al termine di questa prima carrellata, possiamo affermare che: Hibernate un prodotto molto ambizioso, in continua crescita in termini di funzionalit e flessibilit che si colloca al vertice delle possibili scelte di un ORM in ambito Java. Usando Hibernate e le sue Annotation, sia standard sia proprietarie, possiamo descrivere con semplicit il mapping delle proprie classi senza perdere in termini di potenza e rappresentativit delle situazioni pi complesse. In caso di necessit, Hibernate permette di ripiegare su un codice SQL scritto a mano dal progettista dellapplicazione, anche se, grazie alla sofisticazione delle Annotation proprietarie, si tratta di una caratteristica che ha scarse probabilit di dover essere utilizzata. Lutilizzo di Hibernate non solo non comporta perdite di prestazioni ma, in un contesto di Domain Model complesso dove sfruttabile il caching di secondo livello, si possono avere significativi vantaggi rispetto alle soluzioni basati sul semplice JDBC. Hibernate apre la strada in modo semplice allutilizzo di tecnologie avanzate come quelle di full-text search o di clustering multi-database.

I componenti complementari a Hibernate Quando si parla di Hibernate, normalmente, si fa riferimento al prodotto Hibernate Core insieme a Hibernate Annotations. Ma lofferta ancora pi ricca, e si completa con i seguenti prodotti: Hibernate EntityManager. Implementa linterfaccia di programmazione e le regole del ciclo di vita definite dalle specifiche EJB3. Utilizzando lEntityManager si pu quindi adottare uno standard di programmazione EJB3 anche allinterno di un semplice application container come Tomcat. Hibernate Tools. Si tratta di una serie di tools utilizzabili allinterno di un plugin Eclipse o come comandi Ant che facilitano la creazione della configurazione Hibernate (hibernate.cfg.xml), la visualizzazione dello schema persistente, la creazione e laggiornamento dello schema del database sulla base delle specifiche di mapping ed altro ancora. Hibernate Validator. Fornisce un insieme standard di Annotation utilizzabili per la validazione dei dati, come ad esempio @NotNull, @Email, @CreditCardNumber, @Max, @Range, ecc. Lutilizzo di queste Annotation permette di definire a livello di Domain Model delle regole di validazione che possono poi essere utilizzate in diversi punti dellapplicazione. Hibernate Search. Permette di sfruttare la tecnologia Lucene di indicizzazione e di full text search allinterno del Domain Model persistente. Tramite una serie di Annotation vengono creati e mantenuti gli indici necessari per poter poi eseguire ricerche di tipo free-text in modo ottimizzato allinterno delle propriet di tipo testo. Poich viene utilizzato Lucene, lindicizzazione avviene indifferentemente dal fatto che il database manager fornisca una specifica tecnologia a questo scopo. Hibernate Shards. Permette di rendere persistente un Domain Model su pi database, anche posizionati su diversi nodi della rete, in modo trasparente allapplicazione. JBoss Seam. Seam un framework che si pone come ponte tra Hibernate e JSF, allo scopo di favorire la scrittura di sofisticate applicazioni Web in cui sia possibi-

Bibliografia e riferimenti [1] Christian Bauer e Gavin King, Java Persistence with Hibernate, Manning Publications Co. (2007). un testo pubblicato da qualche mese al confronto del quale ogni altro libro in circolazione , al momento, obsoleto oppure incompleto. [2] www.hibernate.org - Il sito di Hibernate.

Note BiograficheMarco Pancotti ha iniziato la sua carriera nel 1982, in una delle maggiori societ internazionali di Business Consulting. Dopo aver diretto una societ di software ha cominciato, a partire dai primi anni 90, ad operare come consulente direzionale in ambito IT. autore di una metodologia per la certificazione di qualit del software basata sullapplicazione della norma ISO 9126 e di un metodo di valutazione della qualit di siti Web orientati alleBusiness. membro del Comitato Tecnico OASIS per la definizione dello standard UBL e realizza applicazioni basate sugli standard ebXML/UBL.

n.4 - settembre/ottobre 2007

13