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'
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.