• Non ci sono risultati.

3.5 Persistenza e gestione dei dati

3.5.1 Object-relational mapping

L’intero layer di persistenza si basa sull’utilizzo di una tecnica di pro- grammazione chiamata Object-relational mapping (ORM). Tale tecnica permette l’integrazione tra sistemi software, sviluppati secondo il paradigma della programmazione orientata agli oggetti (OO), e i sistemi di gestione di basi di dati relazionali (RDMBS). In altre parole, un ORM fornisce, mediante un’interfaccia orientata agli oggetti, tutti i servizi inerenti alla persistenza dei dati, astraendo nel contempo le caratteristiche implementative dello specifico RDBMS utilizzato.

L’operazione di mappatura appena descritta ha una complessit`a molto elevata: nel paradigma OO gli oggetti sono generalmente collezioni di va- lori non scalari ed eterogenei, e vengono rappresentati mediante un grafo interconnesso; al contrario, un RDBMS `e generalmente in grado di gestire e memorizzare solamente valori scalari (e.g. interi, stringhe, etc.) organizzati in forma tabellare e definiti da uno schema relazionale. Il cuore del problema, noto come Object-relational impedance mismatch, riguarda la traduzione del-

la rappresentazione logica degli oggetti in una forma “atomizzata”, in grado di essere archiviata nel database preservando le propriet`a degli oggetti e le loro relazioni. Il paradigma OO fa infatti leva su alcuni principi di base, i quali non sono altrettanto verificati nel modello relazionale. Tra i principali: • Incapsulamento: un programma orientato agli oggetti viene proget- tato utilizzando tecniche di incapsulamento degli oggetti, le quali hanno come risultato l’occultamento dello stato interno dell’oggetto; questo potr`a essere acceduto esclusivamente attraverso metodi predefiniti. Al contrario, lo stato di un oggetto mappato su una riga di una tabella non presenta tale caratteristica, e pu`o essere modificato in maniera diretta. • Interfaccia, Ereditariet`a e Polimorfismo: collegato al punta so- pra, nel paradigma OO un oggetto possiede un’interfaccia, la quale fornisce metodologie univoche per l’accesso allo stato dell’oggetto. Il modello relazionale utilizza invece variabili di relazione derivate (i.e. le viste) per fornire prospettive e vincoli variabili, in modo tale da garan- tire l’integrit`a del dato. Allo stesso modo, i concetti di ereditariet`a e polimorfismo non sono supportati.

• Identit`a: nel paradigma OO, un oggetto esiste in maniera indipen- dente dal proprio stato, in quanto esiste distinzione tra identicit`a ed uguaglianza. Se due oggetti sono identici, essi sono lo stesso oggetto; se sono uguali, essi contengono gli stessi valori. Al contrario, nel modello relazionale una riga viene identificata esclusivamente dal valore della chiave primaria associata alla tabella di appartenenza.

• Coesione: tutte le propriet`a di un oggetto sono contenute all’interno dell’oggetto stesso. Al contrario, `e possibile che i dati relazioni che corrispondono ad una stessa entit`a possono essere stati suddivisi in pi`u tabelle (fase di ristrutturazione dello schema logico).

• Granularit`a dei tipi di dato: tipi di dati compositi sono tipicamente rappresentati nei linguaggi OO mediante classi di oggetti, mentre nel

3.5 Persistenza e gestione dei dati 85

modello relazionale non `e previsto alcun meccanismo per la definizione di tali costrutti.

L’utilizzo della tecnica ORM `e una delle possibili soluzioni al problema descritto. Pi`u in dettaglio, un sistema di questo tipo presenta i seguenti vantaggi:

• superamento del problema dell’impedance mismatch;

• elevata portabilit`a rispetto alla tecnologia DBMS utilizzata. Nel caso in cui si renda necessario una sostituzione del RDBMS sottostante, l’utilizzo di un’astrazione di questo tipo permette di non dover riscrivere le routine che implementano lo strato di persistenza;

• riduzione della quantit`a di codice sorgente. Il sistema ORM masche- ra infatti, dietro semplici comandi, le attivit`a di creazione, prelievo, aggiornamento ed eliminazione dei dati (i.e. CRUD - Create, Read, Update, Delete);

JPA e Hibernate

La Java Persistence API (JPA) `e una collezione di classi e metodi che descrive la metodologia comune per l’accesso, la gestione e l’utilizzo di dati relazionali a partire da programmi basati sul paradigma OO. In altre parole, JPA rappresenta la specifica standard in ambiente Java Enterprise (i.e. Java EE) per l’implementazione di tecniche ORM.

La specifica `e strutturata in quattro componenti:

• Java Persistence API, ovvero il pacchetto vero e proprio contenente l’insieme di metodi e classi dello standard;

• Java Persistence Query Language (JPQL), un linguaggio SQL- like utilizzato per la realizzazione di interrogazioni e/o aggiornamenti di entit`a sul database;

• Java Persistence Criteria API, un insieme di API anch’esse volte all’interrogazione e/o l’aggiornamento di dati. La differenza con l’u- tilizzo di query JPQL risiede nel fatto che queste operazioni vengono eseguite su oggetti e non sul database;

• un metamodel utilizzato per la creazione delle relazioni tra classi ed entit`a del database.

La creazione del modello passa attraverso la definizione del concetto base di entit`a, ovvero una semplice classe Java mappata su una o pi`u tabelle attraverso l’utilizzo di annotazioni. Tra le principali si possono trovare:

• @Entity: utilizzata per marcare una classe Java come un oggetto del domain model (i.e. il modello del database).

• @Table: utilizzata per la gestione dei dettagli di una tabella (e.g. un nome specifico, etc.);

• @Column: analogamente alla precedente, viene utilizzata per la gestio- ne dei dettagli di un attributo (e.g. nome, etc);

• @Id: marca un attributo come chiave primaria del modello;

• @IdClass: utilizzata nel caso in cui la chiave primaria sia rappresen- tata da un insieme di attributi;

• @Transient: evita che una property di una classe venga salvata sul database;

• @NotNull: indica che l’attributo non pu`o contenere il valore nullo. • @OneToOne, @OneToMany, @ManyToOne, @ManyToMany: uti-

lizzati per indicare la tipologia di relazione.

Come gi`a accennato, JPA rappresenta esclusivamente lo standard per l’accesso al RDBMS, e non fornisce alcuna implementazione per le specifiche che propone. La realizzazione vera e propria di queste viene effettuata da

3.5 Persistenza e gestione dei dati 87

Hibernate, una piattaforma middleware open source la quale fornisce il ser- vizio ORM descritto in precedenza; tra le funzionalit`a supportate si trovano ad esempio l’ereditariet`a, il polimorfismo, etc.

Attraverso l’utilizzo di annotazioni JPA, Hibernate genera, a partire da classi Java, il codice SQL relativo per la manipolazione del database: infatti, ogni operazione eseguita a livello di oggetti che abbia delle ripercussioni su un’entit`a del database viene tradotta da Hibernate in codice SQL.

In aggiunta al servizio di ORM, Hibernate fornisce un insieme di funzio- nalit`a aggiuntive rispetto allo standard JPA (e.g. lazy initialization, many fetching, etc.). Tuttavia, `e importante notare come l’utilizzo di tali funzio- nalit`a specifiche, per quanto possano essere comode, vada a rendere vano il contributo di JPA per l’unificazione delle metodologie di gestione della per- sistenza: per tale motivo, all’interno del progetto `e stato scelto di utilizzare esclusivamente le API specificate nello standard JPA.

Documenti correlati