JPA – Java Persistence API

Java Persistence API, o meglio conosciuta con l’acronimo JPA, è un framework Java che si occupa della “gestione della persistenza dei dati di un DBMS relazionale nelle
applicazioni che usano le piattaforme Java Standard Edition e Java Enterprise Edition”. JPA è una piattaforma che estende Hibernate fornendo un consolidato strumento di mapping relazionale.

JPA

Java Persistence API



Java Persistence API si compone essenzialmente di tre aree:

  1. Le API (Application Programming Interface), funzioni legate alla persistenza degli oggetti di dominio.
  2. HQL, Hibernate Query Language, linguaggio di querying.
  3. Metadata Mapping, mapping dei dati mediante i metadati. Tale funzionalità in Hibernate classico agisce mediante file XML, in JPA è progettato mediante le annotations.

Una classe del dominio di dati persistenti è detta Entity. In linea di massima un’entity rappresenta una tabella del database, anche se quest’affermazione non è
sempre vera data la variegata tipologia di oggetti del modello. Affinché una classe del modello possa essere definita persistente oltre ad essere annotato con la @Entity annotation, non deve essere dichiarata come final, ma soprattutto deve implementare l’interfaccia Serializable. Implementare Serializable significa essere abilitati alla fase di detaching, cioè possibilità di passare un oggetto ad un metodo transazionale capace di memorizzare l’oggetto come fosse una riga di una tabella del database.
Affinché le istanze di una classe serializzabile possano essere persistite, l’Entity deve ricalcare lo stile dei Java Beans.
Per spiegare il concetto di JavaBeans partiamo dallo spiegare i POJOs.
Un POJO (Plain Old Java Object) identifica un oggetto Java ordinario, con metodi getter e setter.
I JavaBeans invece sono un modello di programmazione a componenti per il linguaggio Java. Il loro obiettivo è di ottenere parti software riusabili indipendenti dalla piattaforma. La differenza essenziale tra i due è che i JavaBeans possiedono un costruttore pubblico essendo oggetti serializzabili, al contrario i POJO non possiedono questo vincolo. Infatti più nello specifico si parla di POJOs per i mapper delle form e di JavaBeans per le Entity del dominio. Quindi in poche parole i JavaBeans sono dei POJOs, ma non tutti i POJOs sono dei JavaBeans (a causa del fatto che non devono obbligatoriamente implementare l’interfaccia Serializable).
Una classe può essere definita JavaBeans se aderisce a specifiche convenzioni legate ai metodi, al costruttore e al comportamento.
Le convenzioni richieste sono:

  • La classe deve avere un costruttore senza argomenti.
  • Le sue proprietà devono essere accessibili usando metodi getter, e assegnabili mediante metodi setter. In genere si usa anche la naming convention is per
    accedere al valore di una proprietà booleana.
  • La classe deve essere serializzabile.

Ogni entità mappata sul database deve inoltre possedere un identificatore univoco, ciò non vale però gli oggetti del modello annotati con @Embedded seppur implementino anch’esse Serializable. Possedere un identificatore univoco è l’equivalente del concetto di chiave primaria dei comunissimi database relazionali. Una chiave primaria è definita mediante la @Id annotation sul campo se prevede un unico campo.
Le chiavi composite invece in JPA sono definite mediante l’annotation @IdClass dove come proprietà vi è un POJO composto da più campi.
Essendo il dominio un insieme di classi tra loro correlate è di fondamentale importanza la gestione delle molteplicità per gli oggetti in relazione.
In generale vi sono quattro tipologie di molteplicità:

Molteplicità Java Persistence API

Tabella delle molteplicità in JPA


La direzione di una relazione può essere bidirezionale o unidirezionale.
Un legame bidirezionale è mappato da entrambi i lati mentre quello unidirezionale da un solo lato. Il possessore della relazione determina il lato di esecuzione/generazione del legame.
La relazione bidirezionale possiede le seguenti regole:

  • Il lato inverso di un rapporto bidirezionale deve fare riferimento al suo lato possessore utilizzando mappedBy.
  • La precedente regola non vale per la molteplicità ManyToOne, dove il lato Many sarà sempre il possessore della relazione.
  • Nella relazione ManyToMany possono essere entrambi proprietari della relazione.

Nelle relazioni unidirezionali tali problemi non si pongono poiché solo un lato fa riferimento all’altro.
Seppur leggermente più difficili da usare le relazioni bidirezionali portano con sé innumerevoli vantaggi nelle query.
Uno dei vantaggi più rilevanti consiste nel fatto che dal lato non mappato nella relazione unidirezionale non è possibile risalire al referente.
Infatti, in sede di modellazione si preferisce la relazione unidirezionale soltanto se l’istanza non deve risalire al suo referente.
Un’ulteriore fondamentale caratteristica di JPA e Hibernate (come anticipavamo in precedenza) è l’HQL (Hibernate Query Language). Questo è un “linguaggio” che consente di scrivere query portabili indipendenti dalla piattaforma sottostante visto che non si agisce direttamente sui campi del database ma sugli oggetti del dominio.
Non a caso un campo del database può essere chiamato x mentre nel dominio tale field è chiamato y, la query per ottenere tale campo indicherà la dicitura y e non x.

JPA – Java Persistence API ultima modidfica: 2015-09-21T10:22:01+02:00 da admin
Posted in: Java

By on 21 Settembre 2015

Tagged: , , , , , ,