Sie sind auf Seite 1von 7

Mapeo Objeto-Relacional

La mayor parte de una API que persiste objetos a una base de datos relacional termina siendo el componente que realiza el mapeo objetorelacional (ORM) de los componentes. El tema del ORM por lo general incluye todo, desde cmo el estado del objeto se mapea a las columnas de base de datos, hasta la forma de realizar consultas a travs de los objetos.

Anotaciones de Persistencia
Las anotaciones de persistencia pueden ser aplicadas en tres niveles diferentes: clase, mtodo y atributo. Para realizar una anotacin en cada uno de estos niveles, la anotacin debe ser colocada delante de la definicin del cdigo del artefacto que est siendo anotado. En algunos casos, pondremos las anotaciones en la misma lnea justo delante de la clase, mtodo o atributo; en otros casos, colocaremos las anotaciones en la lnea anterior. La eleccin se basa completamente en las preferencias de la persona que se encuentra aplicando las anotaciones. Las anotaciones de JPA fueron diseadas para ser legibles, fciles de especificar, y lo suficientemente flexibles para permitir diferentes combinaciones de metadatos. La mayora de las anotaciones son especificadas al mismo nivel, en lugar de hacerlo una dentro de otra, lo cual significa que mltiples anotaciones pueden anotar la misma clase, atributo o mtodo. El compilador no har uso, pero se realizar en tiempo de ejecucin un chequeo del agrupamiento de anotaciones. Las anotaciones de mapeo pueden ser categorizadas en una de las siguientes maneras: anotaciones lgicas y anotaciones fsicas. Las anotaciones lgicas son aquellas que describen el modelo de entidad desde el punto de vista del modelado de objetos. Ellas se encuentran estrechamente ligadas al modelo de dominio y son el tipo de metadatos que se podran especificar en UML o algn otro lenguaje de modelado orientado a objetos. Las anotaciones fsicas se relacionan con el modelo de datos concreto que se encuentra en la base de datos. Ellas lidian con tablas, columnas, y otros artefactos al nivel de bases de datos.

Accediendo al estado de una Entidad


El estado de mapeo de una entidad debe ser accesible en tiempo de ejecucin, de manera que cuando se necesite escribir datos, puede ser obtenido de una instancia de una entidad y almacenado en la base de datos. Similarmente, cuando el estado es cargado desde la base de datos, se debe poder, en tiempo de ejecucin, insertar los datos en una nueva instancia de una entidad. La manera en que el estado es accedido en la entidad es llamada el modo de acceso.

El Acceso a Atributos
La anotacin del atributo de la entidad causar que el proveedor de persistencia use el acceso a los atributos para obtener y establecer el

estado de la entidad, lo cual se har por medio de los mtodos getters y setters. Todos los campos deben ser declarados como protectec, package o prvate (encapsulamiento). El ejemplo de la Figura 1 muestra la entidad Empleado siendo mapeada empleando el acceso a atributos. La anotacin @Id indica no solo que el atributo id es el identificador de persistencia o el campo clave para la entidad, sino tambin que el acceso al atributo debera ser tenido en cuenta. Los atributos nombre y salario son por defecto persistentes, y son mapeados a columnas con el mismo nombre.

Figura 1

Mapeando a una Tabla


Hemos visto en el ejemplo de la Figura 1 que solo necesitamos especificar las anotaciones @Entity y @Id para crear y mapear una entidad con una tabla de una base de datos. En esos casos, el nombre de la tabla por defecto, es el adecuado Qu pasara si el nombre de la tabla por defecto no es el que queremos? En ese caso, debemos especificar el nombre de la tabla. Para ello, debemos incorporar la anotacin @Table e incluir el nombre de la tabla por medio del elemento name. La Figura 2 muestra una entidad que es mapeado a una tabla que posee un nombre distinto al nombre de la clase.

Figura 2

Mapeando tipos de datos


Los tipos de datos de Java son mapeados como parte del estado inmediato de una entidad en sus atributos. La lista de tipos de datos que se pueden persistir es bastante extensa, e incluye los siguientes tipos de datos: Tipos primitivos de Java: byte, int, short, long, boolean, char, float, double.

Clase envoltorio (wrapper) de tipos primitives de Java: Byte, Integer, Short, Long, Boolean, Character, Float, Double. Tipos arreglos (arrays) de byte y character: byte[], Byte[], char[], Character[]. Tipos numricos de java.math.BigDecimal. Strings: java.lang.String. Tipos temporales de Java: java.util.Date, java.util.Calendar. Tipos temporales java.sql.Timestamp. de JDBC: java.sql.Date, java.sql.Time, rango largo: java.math.BigInteger,

Tipos enumerados: cualquier tipo enumerado definido por el usuario o el sistema. Objetos serializable: cualquier tipo serializable definido por el usuario o el sistema.

Mapeos de Columnas
Especificando @Column en el atributo, se pueden especificar caractersticas de la columna de la bases de datos. Existen varios elementos que pueden ser utilizados como parte esta anotacin. Entre ellos se encuentra name, el cual permite especificar por medio de un String el nombre de la columna de la base de datos. El ejemplo de la Figura 3 muestra cmo podemos sobrescribir el nombre por defecto de la columna para un atributo.

Figura 3

Mapeo de Relaciones
Cada uno de estos mapeos es realmente un mapeo de relacin unidireccional, y si tomamos las cardinalidades del origen y el destino de la relacin y los combinamos entre ellos en ese orden, permutandolos con dos posibles valores de uno o varios. A las distintas relaciones podemos representarlas de la distinta manera:

1. 2. 3. 4.

Many-to-one One-to-one One-to-many Many-to-many

Estos nombre de mapeo son ademas los nombres de las anotaciones que son usadas para indicar los tipos de relaciones en los atributos que estn siendo mapeados.

Asociaciones Valuadas Simples (Single-Valued Associations)


Una asociacin de la instancia de una entidad con la instancia de otra entidad (donde la cardinalidad de la entidad destino es uno) es llamada como una asociacin valuada simple. Mapeos Many-to-One A continuacin, se presenta un ejemplo en donde se muestra una relacin de las entidades Empleado y Departamento. En este ejemplo primero pensamos que un empleado trabaja en un departamento, de manera que asumimos que la relacin es One-to-one. De todas maneras, nos interesa especificar que mas de un empleado trabaja en el mismo departamento, por lo que de esta manera nuestra relacin toma la forma de un mapeo many-to-one. La Figura 1 muestra una relacin many-to-one entre Empleado y Departamento. Empleado es la entidad que tiene cardinalidad many y es el origen de la relacin, y Departamento es la entidad que posee cardinalidad one y es el destino de la relacin.

Figura 4

Figura 5

Un mapeo many-to-one es definido por medio de la anotacin del atributo en la entidad origen (el atributo que hacer referencia a la entidad destino) con la anotacin @ManyToOne. La Figura 3 muestra como la anotacin @ManyToOne es usada para mapear esta relacin.

Figura 6

Mapeos One-to-One Si solo un empleado pudiera trabajar en un departamento, nuestra asociacin se transformara en una del tipo one-to-one. Un ejemplo ms realista de una asociacin one-to-one, podra ser el de un empleado que posee un espacio de estacionamiento. Asumiendo que cada empleado tiene asignado su propio espacio de estacionamiento, deberamos crear una asociacin one-to-one desde Empleado hacia EspacioEstacionamiento. La Figura 3 muestra esta relacin. Definimos el mapeo de una manera similar al que definimos el mapeo many-to-one, excepto que esta vez usamos la anotacin @OneToOne en el atributo espacioEstacionamiento. Al igual que en las relacion many-to-one, las one-to-one poseen una columna join en la base de datos. La Figura 4 muestra las tablas mapeadas por las entidades Empleado y EspacioEstacionamiento. La columna que contiene la clave fornea en la tabla Empleado es nombrada como PSPACE_ID y hace referencia a la tabla PARKING_SPACE.

Figura 7

Mapeos One-to-One Bidireccionales La entidad destino posee una relacin de vuelta con la entidad origen; por ejemplo, EspacioEstacionamiento posee una referencia de vuelta con la entidad Empleado. Cuando este sea el caso, llamamos a esta relacin oneto-one como bidireccional. En realidad, podemos notar que poseemos dos mapeos one-to-one separados, pero cada uno en direcciones opuestas. La Figura 5 muestra la relacin de este tipo.

Figura 8

Asociaciones Valuadas Mltiples


Cuando la entidad origen referencia uno o ms entidades destino, una asociacin valuada mltiple es usada. Tanto los mapeos one-to-many y many-to-many encajan dentro de este criterio, ya que poseen varias entidades destino. La asociacin one-to-many es la ms usada entre ambas. Mapeos One-to-Many Ocurren cuando una entidad es asociada con una coleccin de otras entidades. Por ejemplo, un departamento normalmente tendr ms de un empleado. La Figura 6 muestra la relacin entre Empleado y Departamento. Como se puede apreciar, en este ejemplo se defini directamente la relacin como bidireccional.

Figura 9

Una relacin one-to-many bidireccional, implica un mapeo many-to-one de vuelta, entonces en nuestro ejemplo, existe un mapeo one-to-many desde Departamento a Empleado y un mapeo many-to-one desde Empleado a Departamento. En el modelo de objetos, las clases cuya cardinalidad es mayor a uno, son representadas por Colecciones que contendran objetos de su tipo. Mapeos Many-to-Many Cuando una o ms entidades son asociadas con una coleccin de otras entidades, debemos modelar la relacin como del tipo many-to-many. La Figura 7 muestra una relacin many-to-many entre Empleado y Proyecto. Cada empleado puede trabajar en varios proyectos, y en cada proyecto pueden trabajar varios empleados.

Figura 10

Operaciones de Propagacin (Cascada)


Por defecto, las operaciones del entity manager solo se aplican a la entidad suministrada como parmetro en la operacin. La operacin no propagar las operaciones a otras entidades que posean relacin con la entidad suministrada como parmetro. Para algunas operaciones como la eliminacin, es comportamiento generalmente es el deseado. Pero, el caso contrario ocurre en operaciones como el alta. Considere la secuencia de operaciones de la Figura 8, las cuales son requeridas para la creacin de un empleado, que a su vez posee una relacin con la entidad domicilio. El llamado a la operacin de alta de direccin resulta innecesario si aplicamos el concepto de propagacin. Sera conveniente que, cuando se cree un nuevo empleado, se propague esta operacin y se cree automticamente el domicilio si este no existe.

Figura 11

Afortunadamente, JPA nos provee de mecanismos para aplicar propagacin en las distintas operaciones que pueden realizar los entity managers: persist, remove, etc.

Das könnte Ihnen auch gefallen