Professional Documents
Culture Documents
Wladimiro Daz
Diciembre de 2005
Introduccin
Java y bases de datos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Antecedentes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Persistencia transparente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Objetivos de JDO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Historia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Comparacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2
3
4
5
6
7
8
Interfaces JDO
Preliminares . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
El paquete javax.jdo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Descripcin de clase e interfaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Excepciones en JDO. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9
10
11
12
13
14
15
16
17
18
19
20
Preparacin
Fases de implementacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Diseo de la capa de persistencia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
El chero de metadatos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Localizacin de los metadatos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Un ejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
Un ejemplo
Gestin de pedidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
La clase Telfono . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
La clase Direccin. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
La clase Stock . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
La clase Item. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
La clase Pedido. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
La clase Cliente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
El chero package.jdo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
42
43
44
45
46
47
48
49
50
Introduccin
2 / 50
3 / 50
Antecedentes
Tres estndares de almacenamiento de los datos en Java:
Serializacin.
Se utiliza para escribir el estado de un objeto y el grafo de objetos que ste referencia en un ujo de salida (output
stream).
Preserva las relaciones entre los objetos Java, de modo que es posible reconstruir el grafo completo con
posterioridad.
No soporta transacciones, consultas o acceso compartido a los datos entre usuarios mltiples.
La serializacin se utiliza slo para proporcionar persistencia en aplicaciones simples o en entornos empotrados
que no pueden gestionar una base de datos de forma eciente.
Java Database Connectivity (JDBC).
Es necesario gestionar explcitamente los valores de los campos y su proyeccin en tablas de una base de datos
relacional.
Por tanto, hay que tratar con dos modelos de datos, lenguajes y paradigmas de acceso a los datos, muy diferentes
(Java y SQL).
El esfuerzo necesario para implementar el mapping entre el modelo relacional y el modelo de objetos es demasiado
grande:
Muchos desarrolladores nunca llegan a denir un modelo de objetos para sus datos.
Se limitan a escribir cdigo Java procedural para manipular las tablas de la base de datos relacional subyacente.
Se pierden los benecios y ventajas del desarrollo orientado a objetos.
Enterprise Java Beans (EJB) Container Managed Persistence (CMP).
La aquitectura EJB est diseada para dar soporte a la computacin distribuida de objetos.
Tambin proporciona persistencia a travs de Container Managed Persistence (CMP).
Fundamentalmente debido a su capacidad distribuida, las aplicaciones EJB son ms complejas y ms pesadas de
ejecutar que JDO.
Todos estos mecanismos requieren que el programador conozca los detalles estructurales de la base de datos
subyacente.
Muchos de ellos incluso requieren que sea el propio programador quien se responsabilice de la gestin de los detalles
de persistencia.
Para liberar al programador de esta tarea, el estndar Java Data Objects (JDO en adelante) proporciona un grado de
abstraccin mayor: persistencia transparente.
DBD Java Data Objects
4 / 50
Persistencia transparente
Persistencia transparente signica que:
La persistencia de los objetos es automtica.
Toda la lgica necesaria para procesar los objetos persistentes se expresa en lenguaje Java puro.
El programador de la aplicacin no necesita conocer ningn lenguaje de base de datos, ni siquiera SQL.
La proyeccin entre los objetos Java y los almacenados en la base de datos:
Es realizada fuera de escena por la implementacin JDO.
Es totalmente transparente para el programador de la aplicacin.
Resultado: Desde el punto de vista del programador, los objetos persistentes se manipulan exactamente igual que los
transitorios.
DBD Java Data Objects
5 / 50
Objetivos de JDO
Dos objetivos fundamentales:
Proporcionar una interface estndar entre los objetos de la aplicacin y el almacen de los datos (sea cual sea ste:
base de datos relacional, orientada a objetos o incluso el propio sistema de archivos).
Simplicar el desarrollo de aplicaciones seguras y escalables proprocionando a los desarrolladores con un modelo
nico para trabajar con los datos persistentes.
Adicionalmente:
JDO reduce la necesidad de escribir cdigo SQL explcito y de gestionar las transacciones del sistema.
Acta blindando al desarrollador de Java de los detalles del mecanismo subyacente que proporciona la pesistencia.
DBD Java Data Objects
6 / 50
Historia
El JDO cuenta con una larga historia, aunque slo una parte es visible si nos jamos el desarrollo del propio estndar.
Las races se encuentran en el ODMG (Object Data Management Group).
Primer intento de estandarizar el acceso transparente a bases de datos desde lenguajes de programacin
orientados a objetos.
El estndar ODMG es muy anterior al lenguaje Java.
Desarrollado en una poca en la que el mayor debate entre la comunidad era qu lenguaje orientado a objetos
dominara en el futuro: C++ o Smalltalk.
El debate se qued en el terreno acadmico mientras que Java se conviti en el estndar de facto.
El ODMG respondi adaptando sus interfaces C++ y Smalltalk al lenguaje Java
JDO como ahora lo conocemos se origina por la Java Specication Request JSR-012 propuesta en 1999.
Tras 3 aos de un largo proceso de discusin por la Comunidad Java, nalmente en 2002 se aprob como una
especicacin ocial.
En el intern, muchas otras especicaciones se han convertido en estndares. Por tanto, JDO debe integrarse en el
entorno proporcionado por esas especicaciones relacionadas.
servlets y session EJBs pueden manipular directamente instancias persistentes de JDO en lugar de tratar con el
almacn de datos.
Entity EJBs con persistencia bean-managed pueden delegar la lgica de negocio y la gestin de la persistencia a
las clases JDO, liberando al desarrollador de escribir todos los comandos SQL en la implementacin de las clases.
En la actualidad est sometido a un continuo e intenso desarrollo.
DBD Java Data Objects
7 / 50
Comparacin
Comparacin de los principales mecanismos de persistencia en Java:
Serializacin
JDBC
Persitencia
transparente
Transparente
No transparente
Modelo de objetos
Orientado a objetos
No orientado a objetos
Consultas
No soportado
Transacciones
Portabilidad
EJB
JDO
No/parcialmente
transparente
Transparente
Modelo de objetos
simple. Sin herencia
Si, escribiendo cdigo SQL
Modelo orientado a
objetos totalmente
soportado
Soporte extendido
va JDO QL
No soportado
Soportado
Soportado
Soportado
No aplicable
El mismo nivel de
soporte que JDBC
Excelente
8 / 50
Interfaces JDO
9 / 50
Preliminares
La interface JDO est denida en dos paquetes:
javax.jdo. Dene la interface utilizada para desarrollar las aplicaciones y es la que desarrollaremos a continuacin.
javax.jdo.spi. Contiene interfaces especcas de la implementacin (service provider interface). No es una prctica
recomendable utilizar directamente esta interface.
DBD Java Data Objects
10 / 50
El paquete javax.jdo
JDO es una API realmente pequea, ya que slo necesita seis interfaces:
PersistenceManager.
PersistenceManagerFactory.
Transaction.
Extent.
Query.
InstanceCallback.
Tambin contiene la clase JDOHelper y un conjunto de clases de excepcin.
DBD Java Data Objects
11 / 50
getPersistenceManagerFactory()
PersistenceManagerFactory
getPersistenceManagerFactory()
getPersistenceManager()
getPersistenceManager()
getPersistenceManager()
PersistenceManager
getPersistenceManager()
getExtent()
Extent
newQuery()
currentTransaction()
Transaction
Query
12 / 50
Excepciones en JDO
Son muchos los puntos en los que puede fallar un componente y que no se encuentran bajo el control directo de la
aplicacin.
La fuente del error puede estar en:
En la propia aplicacin.
En la implementacin del JDO.
En el almacenamiento (datastore) subyacente.
En cualquiera de los niveles de la arquitectura multi-tier del sistema.
Para preservar la transparencia de JDO, la losofa de diseo es:
Tratar todas las excepciones como excepciones en tiempo de ejecucin (runtime).
Permitir que el usuario decida qu excepciones especcas capturar dependiendo de los requisitos de la aplicacin.
Las excepciones en JDO se clasican en varias categoras:
Errores de programa que se pueden corregir y por tanto, reintentar la ejecucin.
Errores de programa que no se pueden corregir porque el estado de los componentes se ha modicado.
Errores lgicos internos a la implementacin de JDO y que son responsabilidad del desarrollador de la interface.
Errores asociados al datastore subyacente y que pueden ser corregidos.
Errores asociados al datastore subyacente pero que no pueden ser corregidos debido a un error en el propio
datastore o en la comunicacin con ste.
JDO utiliza interfaces externas al propio API (por ejemplo, Collection). Cualquier excepcin en estos componentes se
utiliza directamente sin modicacin.
java.lang.RuntimeException
JDOException
JDOCanRetryException
JDOFatalException
JDOUserException
JDOFatalUserException
JDOUnsupportedOptionException
JDOFatalInternalException
JDODataStoreException
JDOFatalDataStoreException
JDOObjectNotFoundException
JDOOptimisticVerificationException
13 / 50
14 / 50
Diseo
El diseador de una aplicacin JDO no necesita ocuparse del tipo de base de datos ni del esquema de la base de
datos.
Sin embargo, es conveniente dividir las clases de Java en dos categoras:
Clases persistentes, que son aquellas que contienen los datos gestionados en la base de datos.
Clases de negocio, que son las que contienen la lgica de la aplicacin y las consultas sobre los datos
persistentes.
Las clases persistentes son simples clases de Java con atributos, mtodos de acceso bsicos (getters) y si es
necesario, mtodos de manipulacin (setter y otros).
La especicacin JDO no impone esta separacin lgica, sin embargo:
Se considera una buena prctica separar la lgica de negocio de los datos persistentes.
Hace que las clases persistentes sean ms simples y ms fciles de generar automticamente.
DBD Java Data Objects
15 / 50
16 / 50
10
17 / 50
Proyeccin en el datastore
JDO permite el almacenamiento del modelo de objetos en una gran variedad de arquitecturas de bases de datos.
Base de datos relacional.
Organizada como un conjunto de tablas, cada una de las cuales cuenta con conjunto de las y columnas.
Una columna puede almacenar valores de un tipo atmico determinado.
Cada celdilla de la tabla en una la particular contiene un nico valor del tipo de la columna. El valor almacenado
tambin puede ser un valor nulo.
Las instancias se identican unvocamente por el valor de la columna que contiene la clave primaria.
Las relaciones se denen y se fuerzan mediante columan especcas que contienen claves forneas que
referencian columnas de una tabla.
Base de datos orientada a objetos pura.
Una extensin del modelo de objetos. Los dominios de objetos se almacenan con sus campos primitivos, del mismo
modo que existen en la memoria de la aplicacin.
Las instancias se identican mediante un identicador nico generado por el sistema.
Las referencias se almacenan como objetos y los objetos ya no referenciados son eliminados mediante un garbage
collector.
El extent no es una construccin intrnseca en una base de objetos pura, sino que se implementa como una clase
que contiene un conjunto de objetos.
En este modelo cualquier tipo referenciado puede ser compartido entre mltiples objetos y los cambios realizados
sobre la instancia son visibles a todos los objetos que lo referencian.
Application Programming Interface (API).
APIs que denen mtodos para crear, leer, actualizar y borrar instancias de dominios astractos.
La implementacin del almacenamiento subyacente queda completamente oculta por la API.
La implementacin de JDO proporciona soporte para bases de datos relacionales as como para bases de datos
orientadas a objetos (puras o hbridas).
A medida que la implementacin de JDO est disponible para otras arquitecturas de base de datos, estarn disponibles
nuevas proyecciones.
Por ejemplo, existen bases de datos basadas en el modelo XML, por lo que es previsible que dispongamos en breve de
esa proyeccin
DBD Java Data Objects
18 / 50
11
Class Enhancement
Una vez que las clases han sido compiladas (en bytecode), son alimentadas al enhancer JDO.
El enhancer, a partir de la informacin contenida en el chero XML de metadatos, modica el bytecode del siguiente
modo:
Hace que las clases implementen la interface javax.jdo.PersistenceCapable.
Implementa los mtodos requeridos por la interface javax.jdo.PersistenceCapable basndose en las relaciones entre
objetos y la estructura de la base de datos.
Crea (si es necesario) un esquema de base de datos para los datos pesistentes.
Aade cualquier funcionalidad adicional necesaria para la gestin ptima y transparente de la persistencia.
Estas clases JDO-enhanced son cargadas en la Java Virtual Machine (JVM) en tiempo de ejecucin.
La JVM tambin lee en tiempo de ejecucin el chero XML de metadatos para gestionar los datos persistentes.
En la siguiente gura se esquematiza el proceso de desarrollo y ejecucin de una aplicacin JDO.
Compilador Java
Cdigo fuente
de Java
JDO Enhancer
Fichero .class
compilado
Fichero .class
enhanced
Class Loader
Fichero XML
de metadatos
JVM
19 / 50
Consideraciones nales
Como se observa en el equema, en la JVM slo se cargan las clases enhanced.
Es necesario tener en cuenta, por tanto, el coste en rendimiento:
Las clases enhanced son en general ms grandes que las clases normales. Esto justica el uso de las clases de
negocio.
El trco con la base de datos (que tpicamente reside en otro nodo de la red) deteriora el rendimiento. Para
soslayar este potencial punto dbil muchas implementaciones cuentan con complejos sistemas de caching.
DBD Java Data Objects
20 / 50
12
Preparacin
21 / 50
Fases de implementacin
Como hemos visto, en la implementacin de un sistema JDO se pueden distinguir dos fases:
La primera fase de denicin de las clases que deben ser persistentes. Esto se hace mediante la denicin del
chero XML de metadatos.
La segunda fase consiste en denir el cdigo necesario para proporcionar persistencia a estas clases, permitir su
recuperacin y reutilizacin y su eliminacin cuando alcanzan el nal de su ciclo de vida.
DBD Java Data Objects
22 / 50
23 / 50
13
El chero de metadatos
El chero XML de metadatos se utiliza para denir cmo deben persistir las clases y qu atributos de la clases deben
persistir.
Constituye una parte esencial del sistema JDO y se utiliza tanto en el proceso de enhancement como en tiempo de
ejecucin.
La meta-informacin es necesaria para las siguientes clases:
Las clases persistentes (PersistenceCapable).
Cualquier clase que modique directamente los campos de una clase persistente (PersistenceAware).
Las clases PersistenceAware requiere una entrada de la forma:
<class name=unaClase persistence-modier=persistence-aware/>
24 / 50
25 / 50
14
Un ejemplo
Supongamos que queremos proporcionar persistencia a la siguiente clase Java de ejemplo:
package dbd.sgp.bussines;
import java. util .;
/
Clase Cliente
/
public class Cliente implements Comparable {
private int numCliente;
private String nombre;
protected Direccion direccion;
protected Collection<Telefono> telefonos = new HashSet<Telefono>();
protected Collection<Pedido> pedidos = new HashSet<Pedido>();
...
}
26 / 50
15
27 / 50
Modelo relacional
Clase
Tabla
Campo
Columna
Instancia
Fila
Identidad
Clave primaria
Referencia
Clave fornea
Interface
Sin equivalente
Coleccin
Sin equivalente
Herencia de clases
28 / 50
16
Colecciones Java
Las colecciones en JDO se pueden representar slo como instancias en memoria y que carecen de representacin
directa como tales en el datastore.
Se instancian bajo demanda y se descartan cuando ya no son necesarias.
Hay sin embargo excepciones a esas reglas generales y algunas implementaciones soportan proyecciones ms
avanzadas.
DBD Java Data Objects
29 / 50
Proyeccin automtica
Si comenzamos con un conjunto de clases Java y dejamos que la implementacin del JDO genere el esquema
relacional:
ste escoger una representacin relacional apropiada para las clases de Java.
Realizar la proyeccin entre las clases y las tablas relacionales.
La implementacin tomar una serie de decisiones, incluyendo el nombre de las tablas y columnas, los tipos de
columna para los campos de Java y cmo se representan las colecciones y relaciones del modelo.
Es til comprender las diferentes decisiones de proyeccin que se pueden realizar.
Esto permite valorar la exibilidad que ofrecen las varias implementaciones de JDO y determinar cules se integran
ms fcilmente en el entorno de desarrollo utilizado.
DBD Java Data Objects
30 / 50
17
31 / 50
Proyeccin de dominios
Los tipos de datos que se pueden utilizar para un tipo de Java especco varan entre los sistemas relacionales y la
implementacin de JDO.
Los tipos de columnas soportados para cada tipo Java en cada almecenamiento subyacente se especica en la
documentacin especca de la implementacin de JDO.
En la tabla se muestra una lista de los tipos de dato relacionales comunmente soportados para los tipos de dato Java
soportados por JDO.
Tipo de dato Java
Boolean, boolean
Byte, byte
Character, char
Short, short
Integer, int
Long, long
Float, oat
Double, double
BigInteger
BigDecimal
String
Date
Locale
VARCHAR
32 / 50
18
Algunos de estos mtodos requieren atributos adicionales, pero son simples de especicar.
En este tipo de identidad, no es posible obtener la identidad del objeto accediendo a un campo asociado (porque no
existe).
Existen sin embargo otras formas de acceder a la identidad:
/*
* pm es una instancia de PersistenceManager
*/
Object id = pm.getObjectId(obj);
y tambin:
Object id = JDOHelper.getObjectId(obj);
33 / 50
19
34 / 50
20
Generacin de la identidad
Mediante la especicacin de identidad datastore o application se dene quin tiene control sobre el proceso de
asignacin de la identidad.
Sin embargo, existen mecanismos para denir cmo se asignan automticamente estos valores (incluso aunque no
sean valores que denan la identidad).
JDO exige que la implementacin soporte la generacin automtica de los valores de las claves tanto para identidad
datastore como application.
Los mtodos para generar los identicadores nicos son en muchos casos dependientes del almacenamiento
subyacente, pero se dispone tambin de mtodos neutros.
Los mtodos dependientes del datastore son en general ms ecientes.
Para la identidad datastore el elemento de metainformacin es:
<class name="MyClass" identitytype="datastore">
<datastoreidentity strategy=" ... ">
<datastoreidentity/>
...
</class>
35 / 50
36 / 50
21
Implementacin de la herencia
En Java es muy frecuente utilizar la herencia entre clases.
En JDO existe la posibilidad de decidir cmo se implementa la persistencia de las clases en la jerarqua de herencia.
Las elecciones posibles son:
Cada clase en su propia tabla del datastore (new-table).
Hacer que la superclase mantenga sus campos en la tabla de sus subclases (subclass-table).
Subir los campos de las subclases a la tabla que contiene la superclase (superclass-table).
Utilizaremos el siguiente digrama UML para ilustrar las posibilidades:
ProductoAbstracto
+nombre : String
+descripcion : String
Producto
+precio : String
Libro
DiscoCompacto
+isbn : String
+autor : String
+titulo : String
+artista : String
+titulo : String
GuiaViaje
+pais : String
37 / 50
22
Herencia new-table
Utilizamos una tabla separada para cada clase.
Ventajas: Es la denicin de los datos ms normal.
Inconvenientes: Peor rendimiento, ya que es necesario acceder a mltiples tablas para recuperar los objetos de un
subtipo.
<package name="ejemplo.almacen">
<class name="ProductoAbstracto">
<inheritance strategy="newtable"/>
< eld name="nombre">
<column length="100" jdbctype="VARCHAR"/>
</ eld >
< eld name="descripcion">
<column length="255" jdbctype="VARCHAR"/>
</ eld >
</class>
<class name="Producto"
persistencecapable superclass="ejemplo.almacen.ProductoAbstracto">
<inheritance strategy="newtable"/>
< eld name="price"/>
</class>
...
PRODUCTO
+PRODUCT_ID
PRECIO
LIBRO
DISCOCOMPACTO
+PRODUCT_ID
ARTISTA
TITULO
+PRODUCT_ID
ISBN
AUTOR
TITULO
GUIAVIAJE
+PRODUCT_ID
PAIS
38 / 50
23
Herencia subclass-table
En algunos casos es conveniente denir la persistencia de una clase en la tabla de sus subclases.
Esto es especialmente cierto cuando se dispone de una clase base abstracta y carece de sentido disponer de una tabla
separada para esa clase (siempre vaca).
<package name="ejemplo.almacen">
<class name="ProductoAbstracto">
<inheritance strategy="subclasstable"/>
< eld name="name">
<column length="100" jdbctype="VARCHAR"/>
</ eld >
< eld name="description">
<column length="255" jdbctype="VARCHAR"/>
</ eld >
</class>
...
PRODUCTO
+PRODUCT_ID
PRECIO
NOMBRE
DESCRIPCION
LIBRO
DISCOCOMPACTO
+PRODUCT_ID
ISBN
AUTOR
TITULO
+PRODUCT_ID
ARTISTA
TITULO
GUIAVIAJE
+PRODUCT_ID
PAIS
39 / 50
24
25
Herencia superclass-table
Las tablas de las subclases se almacenan en la tabla de la superclase.
Los atributos de las subclases tienen que embeberse en la tabla de la superclase.
Ventajas:
Es posible recuperar un completo objeto accediendo slo a una tabla.
Desventajas:
La tabla resultante puede contener un gran nmero de columnas, lo que diculta la legibilidad de la base de datos y
en algunos casos degradar el rendimiento.
Es necesario aadir una columna para discriminar los diferentes tipos de objetos.
Existen varias formas de realizar la compactacin de la herencia. Veremos la ms general:
Utilizaremos un discriminador (columna) .
Deniremos para cada clase el valor que puede tomar esa columna.
<class name="Producto">
<inheritance strategy="newtable">
<discriminator strategy="valuemap" value="PRODUCTO">
<column name="TIPO_PRODUCTO"/>
</ discriminator >
</inheritance>
< eld name="precio"/>
</class>
<class name="Libro" persistence capable superclass="ejemplo.almacen.Producto">
<inheritance strategy="superclasstable">
<discriminator value="LIBRO"/>
</inheritance>
< eld name="isbn">
<column length="20" jdbctype="VARCHAR"/>
</ eld >
< eld name="author">
<column length="40" jdbctype="VARCHAR"/>
</ eld >
< eld name="title">
<column length="40" jdbctype="VARCHAR"/>
</ eld >
</class>
...
<class name="GuiaViaje" persistence capable superclass="ejemplo.almacen.Libro">
<inheritance strategy="superclasstable">
<discriminator value="TRAVELGUIDE"/>
</inheritance>
< eld name="country">
<column length="40" jdbctype="VARCHAR"/>
</ eld >
</class>
<class name="DiscoCompacto" persistencecapable superclass="...">
<inheritance strategy="superclasstable">
<discriminator value="DISCOCOMPACTO"/>
</inheritance>
< eld name="artista">
<column length="40" jdbctype="VARCHAR"/>
</ eld >
< eld name="titulo">
<column name="TITULO_DISCO" length="40" jdbctype="VARCHAR"/>
</ eld >
</class>
como
PRODUCTO
+PRODUCT_ID
PRECIO
NOMBRE
DESCRIPCION
ISBN
AUTOR
TITULO
PAIS
ARTISTA
TITULO_DISCO
26
TIPO_PRODUCTO
DBD Java Data Objects
40 / 50
Relaciones
Las relaciones se caracterizan por su cardinalidad.
Relaciones 1-a-1, 1-a-N y M -a-N .
Las relaciones tambin pueden ser unidireccionales o bidireccionales:
En una relacin unidireccional, una instancia se relaciona con una instancia
slo puede recorrerse desde hasta el extremo .
Cuenta
Direccion
nombre : String
1
apellidos : String
direcciones : Collection
ciudad : String
calle : String
Las relaciones bidireccionales son recprocas; cada una hace referencia a la otra. Si existe una relacin
bidireccional entre las clases y , entonces la clase hace referencia a y hace referencia a .
Direccion
Cuenta
nombre : String
1
apellidos : String
direcciones : Collection
ciudad : String
calle : String
direccion : Direccion
41 / 50
27
Un ejemplo
42 / 50
Gestin de pedidos
Diagrama de clases UML original:
Stock
Pedido
Cliente
#cliente
numCliente
nombre
0..*
#pedidos
numPedido
fechaPedido
fechaEnvio
0..*
0..*
#items
numStock
precio
tasa
Item
#telefonos
0..*
#direccion
Telefono
#direccion
cantidad
descuento
Direccion
tipo
numTelefono
calle
poblacion
provincia
codigoZip
Cliente
numCliente
nombre
#telefonos
0..*
Telefono
tipo
numTelefono
#cliente
0..*
#pedidos
numPedido
fechaPedido
fechaEnvio
#direccion
Stock
Item
#pedido 0..*
#items
cantidad
descuento
numStock
precio
#stock tasa
0..*
#direccion
Direccion
calle
poblacion
provincia
codigoZip
43 / 50
28
La clase Telfono
package dbd.sgp.bussines;
public class Telefono {
private String tipo ;
private String telefono ;
public Telefono(String ti , String tl ) {
tipo = ti ;
telefono = tl ;
}
public String getTipo() { return tipo ; }
public String getTelefono() { return telefono ; }
public void setTipo(String ti ) { tipo = ti ; }
public void setTelefono(String tl ) { telefono = tl ; }
public String toString () { return ""+tipo+": "+telefono; }
}
44 / 50
La clase Direccin
package dbd.sgp.bussines;
public class Direccion {
private String calle , poblacion, provincia , codigoZip;
public Direccion(String cl , String po, String pr, String cz) {
calle = cl ;
poblacion = po;
provincia = pr;
codigoZip = cz;
}
public String getCalle() { return calle ; }
public String getPoblacion() { return poblacion; }
public String getProvincia() { return provincia ; }
public String getCodigoZip() { return codigoZip; }
public void setCalle(String cl ) { calle = cl ; }
public void setPoblacion(String po) { poblacion = po; }
public void setProvincia(String pr) { provincia = pr ; }
public void setCodigoZip(String cz) { codigoZip = cz; }
public String toString () { return ""+calle+". "+codigoZip+""
+poblacion+" ("+provincia+")"; }
}
45 / 50
29
La clase Stock
package dbd.sgp.bussines;
public class Stock implements Comparable {
private int numStock;
private String descripcion;
private double precio;
private double tasa;
// Constructor, getters y setters
...
public String toString () {
return numStock + "; " + descripcion + "; Precio: " + precio +
" ; I.V.A: " + 100.0 tasa + " %";
}
public int compareTo(Object o) {
Stock s;
if (o instanceof Stock) {
s = (Stock)o;
return numStock s.numStock;
}
else
return 0;
}
}
46 / 50
La clase Item
package dbd.sgp.bussines;
public class Item {
private int cantidad;
private double descuento;
protected Pedido pedido;
protected Stock stock;
// Constructores, getters y setters
...
public String toString () {
return stock.getNumStock() + " " + stock.getDescripcion() +
" ; Precio: " + stock.getPrecio() + " ; Tasa: " +
100.0 stock.getTasa() + " %" + "; Cantidad: " + cantidad +
" ; Descuento: " + 100.0descuento + " %";
}
}
47 / 50
30
La clase Pedido
package dbd.sgp.bussines;
import java. util .;
import java.text .;
public class Pedido implements Comparable {
private int numPedido;
private Calendar fechaPedido;
private Calendar fechaEnvio;
protected Cliente cliente ;
protected Direccion direccion;
protected Collection<Item> items = new ArrayList<Item>();
// Constructores, getters y setters
...
public Collection<Item> getItems() { return items; }
...
public void addItem(Item i) { items.add(i ); }
public void removeItem(Item i) { items.remove(i); }
public int compareTo(Object o) {
...
}
public void printPedido() {
...
}
}
48 / 50
La clase Cliente
public class Cliente implements Comparable {
private int numCliente;
private String nombre;
protected Direccion direccion;
protected Collection<Telefono> telefonos = new HashSet<Telefono>();
protected Collection<Pedido> pedidos = new HashSet<Pedido>();
public Cliente(String n) { nombre = n; }
// getters
...
public Collection<Telefono> getTelefonos() { return telefonos ; }
public Collection<Pedido> getPedidos() { return pedidos; }
// setters
...
public void addTelefono(Telefono tlfno) { telefonos .add(tlfno ); }
public void addPedido(Pedido p) { pedidos.add(p); }
public int compareTo(Object o) {
...
}
...
}
49 / 50
31
El chero package.jdo
<?xml version="1.0"?>
<!DOCTYPE jdo PUBLIC
" //Sun Microsystems, Inc.//DTD Java Data Objects Metadata 2.0//EN"
" http: // java.sun.com/dtd/jdo_2_0.dtd">
<jdo>
<package name="dbd.sgp.bussines">
<!
# Telefono: identidad controlada por JDO.
#
# Atributos:
#
tipo
(varchar).
#
telefono
(varchar).
# Relaciones: ninguna
#
>
<class name="Telefono" identitytype="datastore">
<inheritance strategy="newtable"/>
< eld name="tipo" persistence modier="persistent"/>
< eld name="telefono" persistence modier="persistent"/>
</class>
...
<!
# Direccion: identidad controlada por JDO.
#
# Atributos:
#
calle
(varchar).
#
poblacion
(varchar).
#
provincia
(varchar).
#
codigoZip
(varchar).
# Relaciones: ninguna
#
>
<class name="Direccion" identitytype="datastore">
<inheritance strategy="newtable"/>
< eld name="calle" persistence modier="persistent"/>
< eld name="poblacion" persistence modier="persistent"/>
< eld name="provincia" persistencemodier="persistent"/>
< eld name="codigoZip" persistencemodier="persistent"/>
</class>
...
<!
# Stock: identidad controlada por la aplicacion y generada por
#
la base de datos.
#
# Atributos:
#
numStock
(integer PK, AutoInc).
#
descripcion (varchar).
#
precio,tasa (double).
# Relaciones: ninguna
#
>
<class name="Stock" identitytype="application">
<inheritance strategy="newtable"/>
< eld name="numStock" persistence modier="persistent" primary key="true"
valuestrategy="autoassign"/>
< eld name="descripcion" persistencemodier="persistent"/>
< eld name="precio" persistence modier="persistent"/>
< eld name="tasa" persistence modier="persistent"/>
</class>
...
<!
# Cliente: identidad controlada por la aplicacion y generada por
#
la base de datos.
#
# Atributos:
#
numCliente
( integer PK, AutoInc).
#
nombre
(varchar).
# Relaciones:
#
direccion
(1:1 unidireccional >)
#
telefonos
(1:N unidireccional >)
#
pedidos
(1:N bidireccional )
#
>
<class name="Cliente" identitytype="application">
<inheritance strategy="newtable"/>
< eld name="numCliente" persistencemodier="persistent"
primary key="true" valuestrategy="autoassign"/>
< eld name="nombre" persistencemodier="persistent"/>
< eld name="direccion" persistence modier="persistent"/>
< eld name="telefonos" persistence modier="persistent">
< collection elementtype="dbd.sgp.bussines.Telefono"/>
</ eld >
< eld name="pedidos" persistence modier="persistent"
mapped by="cliente">
< collection elementtype="dbd.sgp.bussines.Pedido"/>
</ eld >
</class>
<!
# Pedido: identidad controlada por la aplicacion y generada por
#
la base de datos.
#
# Atributos:
#
numPedido
(integer PK, AutoInc).
#
fechaPedido
(date).
#
fechaEnvio
(date).
# Relaciones:
#
cliente
(1:1 bidireccional )
#
direccion
(1:1 unidireccional >)
#
items
(1:N bidireccional )
#
>
<class name="Pedido" identitytype="application">
<inheritance strategy="newtable"/>
< eld name="numPedido" persistencemodier="persistent"
primary key="true" valuestrategy="autoassign"/>
< eld name="fechaPedido" persistence modier="persistent"/>
< eld name="fechaEnvio" persistencemodier="persistent"/>
< eld name="cliente" persistence modier="persistent"/>
< eld name="direccion" persistence modier="persistent"/>
< eld name="items" persistencemodier="persistent" mapped by="pedido">
< collection element type="dbd.sgp.bussines.Item"/>
</ eld >
</class>
<!
# Item: identidad controlada por JDO.
#
# Atributos:
#
cantidad
( integer ).
#
descuento
(double).
# Relaciones:
#
pedido
(N:1 bidireccional )
#
stock
(N:1 unidireccional >)
#
>
<class name="Item" identitytype="datastore">
<inheritance strategy="newtable"/>
< eld name="cantidad" persistencemodier="persistent"/>
< eld name="descuento" persistencemodier="persistent"/>
< eld name="pedido" persistence modier="persistent"/>
< eld name="stock" persistence modier="persistent"/>
</class>
</package>
</jdo>
50 / 50
32