sabato 30 agosto 2008

Chiavi primarie con Grails

Tutto è partito dall'esigenza di recuperare informazioni presenti su alcuni siti Web per un'elaborazione successiva. Non essendo disponibili meccanismi standard di accesso a tali informazioni (ad esempio WebServices), ho dovuto recuperarle direttamente dalle pagine HTML. Per accelerare questa operazione, abbastanza noiosa se si cerca di eseguirla tramite parsing diretto della stringa corrispondente alla pagina, ho utilizzato una libreria che avevo scoperto un po' di tempo fa, ma che non avevo avuto ancora modo di sfruttare, cioè HtmlUnit. Grazie ad essa, ho potuto accedere ai singoli elementi della pagina, ad esempio alla tabella contenente i dati di interesse e a leggere il contenuto delle varie celle, direttamente per posizione (riga, colonna).
Una volta recuperate le informazioni si è presentato il problema di come salvarle: una soluzione rapida, ma poco efficace, sarebbe stata di creare un file e da questo un database relazionale, tramite qualche strumento di ETL. Ma a questo punto, come accedere ai dati presenti sul DB, se non con lo strumento di amministrazione standard? Ho quindi deciso di sfruttare la velocità di realizzazione di applicazioni Web con accesso a database messa a disposizione da Grails. Ho definito le classi di Dominio, con i campi necessari e le relazioni reciproche (grazie alle parole chiave hasMany e belongsTo) . A questo punto mi sono scontrato con il problema argomento di questo post, cioè la gestione delle chiavi primarie prevista da GORM, il meccanismo di Object Relational Mapping previsto da Grails.
Ogni classe di Dominio viene arricchita automaticamente di un attributo id, corrispondente all'identificativo univoco della singola istanza e alla chiave primaria della tabella relativa. Tale campo è di tipo intero e viene generato automaticamente sfruttando le funzionalità del database server utilizzato (ad esempio un autoincrementante) . Nel mio caso sarebbe stato più opportuno sfruttare come chiave primaria uno dei campi della classe (chiave naturale) di tipo stringa e quindi ho cercato il modo per ottenere questo risultato. Tuttavia nella documentazione non si fa cenno a questa possibilità, si spiega solo come utilizzare il mapping delle colonne per dare un nome diverso alla colonna contenente l'id e come creare chiavi composte (di cui fra l'altro si sconsiglia l'uso). Dopo un bel po' di ricerche su Internet e di prove, ho trovato la soluzione, anche se non proprio quella che avrei voluto:
  • ho definito esplicitamente il campo id, dichiarandolo di tipo String
  • nel mapping ho indicato id type:'string', generator:'assigned'
Grazie al generator di tipo assigned, GORM ha evitato di autogenerare il valore della chiave, utilizzando invece quello impostato nel codice applicativo. Putroppo non sono riuscito ad utilizzare il nome che avrei voluto per questo campo (ad esempio codice); comunque, ho preferito non ricorrere al mapping manuale tramite file XML di Hibernate, perché si sarebbe perso lo spirito della Convention over Configuration tipica di Grails.
Il risultato è stato nonostante tutto notevole, visto che ho potuto utilizzare direttamente da Groovy tutto il codice scritto in Java e che, grazie allo scaffolding, si riesce a navigare nella base dati scrivendo poche righe di codice.

venerdì 29 agosto 2008

Benvenuti sul mio nuovo blog

Saluto in questo primo post i miei cinque lettori. Ho aperto questo blog per condividere con tutti le piccole scoperte in ambito informatico che compio quasi tutti i giorni durante il mio lavoro in DataFox. Spero che possano essere utili a chi si cimenta con le problematiche delle tecnologie innovative, che, proprio perché tali, spesso ci lasciano in panne e con pochi strumenti (se non l'impagabile Google) per uscire dal guado.
In questi ultimi mesi ho iniziato a studiare più approfonditamente piattaforme e framework nuovi o già affermati, ma che ancora non avevamo utilizzato in progetti di un certo spessore, in particolare Groovy e Grails per lo sviluppo di applicazioni Web, Hibernate per l'accesso a DataBase, Spring per migliorare l'architettura applicativa. Sto seguendo con un certo interesse anche la libreria ZK e tutti i moduli collegati. Infine mi piacerebbe provare a realizzare qualche applicazione per BlackBerry, visto che anche per questo smartphone la piattaforma è Java, mentre l'iPhone resta per ora un argomento di pura speculazione.
Nei prossimi post proverò a raccontare come ho utilizzato queste tecnologie e come ho risolto i vari problemi che si verificano sempre e che rendono il nostro lavoro stimolante, cominciando proprio da un esperimento fatto con Grails.

Buone cose a tutti.
Ricerca personalizzata