A una aplicació tenim un model de domini: un model que representa els conceptes claus del domini d'un problema, i que conté tant dades com comportaments. Aquestes dades (Objecte) poden necessitar ser emmagatzemades (Relacional), i llavors necessitem un model de persistència.
Problema: la representació de dades en memòria (Objectes) i en BBDD (relacional) són molt diferents.
Aspectes a considerar per fer el mapatge:
És poc factible dissenyar les dades en memòria sense pensar en la seva persistència, per tant és convenient dissenyar un model de domini més relacional. Fins i tot, per certes aplicacions, es pot tenir a memòria el model relacional.
Utilitzant patrons de disseny, podem resoldre situacions habituals que es donen a la programació de BBDD.
JDBC és el model de persistència bàsic a Java. En funció de la mida i el tipus de projecte és possible que necessitem ajuda per implementar aspectes recurrents al codi:
Totes aquestes qüestions ens poden portar a escollir una llibreria o un framework.
Alguns interessants implementats amb Java:
L'API de persistència de Java proporciona als desenvolupadors de Java una facilitat d'assignació d'objectes / relacions per gestionar dades relacionals en aplicacions Java. La persistència de Java es compon de quatre àrees:
Avantatges d'utilitzar JPA versus JDBC:
Desavantatges:
A una relació bidireccional com la de Employee/Department es poden veure dos mapeigos:
<many-to-one name="camp" target-entity="Objecte" >
<join-column name="columna"/>
</many-to-one>
On camp és el camp/columna són els camps de l'objecte/taula que ens porten a l'entitat Objecte.
<one-to-many name="camp1" target-entity="Objecte" mapped-by="camp2" />
On camp1 (habitualment un nom plural) és el camp de l'objecte que ens porta a Objecte, i camp2 el camp de Objecte que fa la relació de tornada.
Suposem que tenim una entitat arrel, que té una sèrie d'entitats relacionades mitjançant Many-to-One, o One-to-Many.
El "fetch type" defineix què farà JPA per obtenir les dades d'una entitat relacionada amb una altra. Tenim dues opcions:
Hi ha un valor per defecte segons el tipus de mapeig:
OneToMany: LAZY
ManyToOne: EAGER
ManyToMany: LAZY
OneToOne: EAGER
Ens pot aparèixer una LazyInitializationException (Hibernate) indicant que no hem pogut obtenir alguna entitat relacionada.
Podem utilitzar JOIN FETCH a la query JPQL per forçar la lectura de les entitats relacionades.
Una alternativa també és utilitzar DTOs (Data Transfer Objects) en lloc d'entitats, que no requereixen que s'obtingui cap relació relacionada.
Per tenir l'ajuda de la documentació a Netbeans (Ctrl+Space), afegiu el javadoc ("Attach Javadoc") corresponent a la versió instal.lada (javax.persistence-api-2.2-javadoc.jar).