Francisco Javier Martínez Páez

Consultor tecnológico de desarrollo de proyectos informáticos.

 Ingeniero Técnico en Telecomunicaciones

Puedes encontrarme en Autentia: Ofrecemos servicios de soporte a desarrollo, factoría y formación

Somos expertos en Java/J2EE

Ver todos los tutoriales del autor

Fecha de publicación del tutorial: 2008-01-21

Tutorial visitado 9.048 veces Descargar en PDF
"Icefaces, JBoss, Maven2 y EJB3

Icefaces, JBoss, Maven2 y EJB3: Parte 4.

En esta parte cuarta del tutorial, os voy a enseñar como realizar el mapeo de las entidades usando el descriptor 'orm.xml'. Hay mucha discusión acerca de la conveniencia o no de usar anotaciones en lugar de descriptores, ya que algunos opinan (y no sin falta de razón) que usar anotaciones para realizar este tipo de tareas no deja de ser una forma de acoplamiento entre el esquema de base de datos y el modelo de negocio, mientras que otros defienden que de alguna manera ya se hacía cuando se usaba JDBC directamente.

Yo, personalmente, considero que la solución correcta merece una respuesta 'a la gallega', es decir, depende. Considero que si nuestro modelo de datos es lo suficientemente estable, las anotaciones son una manera sencilla y elegante de realizar el mapeo (sin entrar a discutir más historias). Si por el contrario, nos encontramos en situaciones de inestabilidad en cuanto al modelo de datos, creo que usar descriptores es una forma de desacoplarnos de cambios continuos en el modelo de datos.

  1. Recordatorio del modelo de negocio.

    Os recuerdo el modelo de negocio que ya usamos para el tutorial anterior:




  1. El descriptor orm.xml

    Vamos ahora a realizar el mapeo usando el descriptor orm.xml. Si queréis echarle un vistazo al esquema que lo define podéis hacerlo en: http://java.sun.com/xml/ns/persistence/orm_1_0.xsd

    Ya os aviso que tengáis cuidado en orden de los atributos, ya que el esquema obliga a hacerlo así ('sequence'), es decir, que por ejemplo, debemos definir los 'one-to-many' antes que los 'many-to-many'.

<?xml version="1.0" encoding="UTF-8"?>

<entity-mappings version="1.0"

xmlns="http://java.sun.com/xml/ns/persistence/orm"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm orm_1_0.xsd">

<persistence-unit-metadata>

<persistence-unit-defaults>

<access>PROPERTY</access>

</persistence-unit-defaults>

</persistence-unit-metadata>

<package>com.autentia.tutoriales.modelo.entidades</package>

<entity name = "Autor" class = "Autor">

<attributes>

<id name = "id">

<generated-value strategy = "AUTO" />

</id>

<basic name = "nombre" />

<basic name = "apellidos" />

<many-to-many name="libros" mapped-by="autores" />

</attributes>

</entity>

<entity name = "Libro" class = "Libro">

<attributes>

<id name = "id">

<generated-value strategy = "AUTO" />

</id>

<basic name = "titulo" />

<basic name = "isbn" />

<many-to-one name="categoria">

<join-column referenced-column-name="id" name="categoriaId"/>

</many-to-one>

<many-to-one name="socio">

<join-column name="socioId" referenced-column-name="id"/>

</many-to-one>

<many-to-many name="autores">

<join-table name="Libro_Autor">

<join-column name="libro" referenced-column-name="id" />

<inverse-join-column name="autor" referenced-column-name="id" />

</join-table>

</many-to-many>

</attributes>

</entity>

<entity name = "Categoria" class = "Categoria">

<attributes>

<id name = "id">

<generated-value strategy = "AUTO" />

</id>

<basic name = "nombre" />

<basic name = "descripcion" />

</attributes>

</entity>

<entity name = "InformacionContacto" class = "InformacionContacto">

<attributes>

<id name = "id">

<generated-value strategy = "AUTO" />

</id>

<basic name = "email" />

<basic name = "movil" />

<basic name = "fijo" />

</attributes>

</entity>

<entity name = "Socio" class = "Socio">

<attributes>

<id name = "id">

<generated-value strategy = "AUTO" />

</id>

<basic name = "nombre" />

<basic name = "apellidos" />

<one-to-many name="libros" mapped-by="socio" />

<one-to-one name="informacionContacto">

<primary-key-join-column name="id" referenced-column-name="socioId" />

</one-to-one>

</attributes>

</entity>

</entity-mappings>

                                



Este fichero debemos crearlo en el proyecto 'Modelo' en: src/main/java/META-INF/orm.xml

En este momento tenemos configurado el mapeo de dos maneras diferentes, y la pregunta es: ¿ Quién prevalece ?. Evidentemente basta leerse un libro o la especificación para saber que prevalece la información del descriptor sobre las anotaciones, aunque pueden convivir ambas. Nosotros vamos a probar que esto es verdad en el siguiente apartado:

  1. El descriptor prevalece sobre las anotaciones.

    Para demostrar esto vamos a crearnos una nueva tabla denominada: 'Libro_Autor_version_2' con el mismo objetivo que 'Libro_Autor', es decir, una tabla intermedia para poder crear la relación 'many_to_many' entre Libros y Autores de los libros y vamos a insertarle datos absurdos (p.ej. vamos a decir que el 'Discurso del método' lo escribió 'Miguel de Cervantes'). Una vez hecho esto, vamos a modificar el descriptor 'orm.xml' para decirle que la tabla intermedia en la relación 'many-to-many' es esta nueva tabla, en lugar de la anterior que contiene información correcta. En función de quien sea el autor del Quijote que muestre por consola sabremos quien prevalece (el decriptor o la anotación)

    Primero creamos un pequeño script para crear la nueva tabla y que inserte datos de prueba incorrectos:

CREATE TABLE IF NOT EXISTS `Libro_Autor_Version_2` (

`libro` int NOT NULL,

`autor` int NOT NULL,

PRIMARY KEY (`libro`,`autor`),

index `ndx_libro2` (`libro`),

index `ndx_autor2` (`autor`),

CONSTRAINT `fk_libroAutor_libro2` FOREIGN KEY (`libro`) REFERENCES `Libro` (`id`),

CONSTRAINT `fk_libroAutor_autor2` FOREIGN KEY (`autor`) REFERENCES `Autor` (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci;



insert into Libro_Autor_Version_2 (`libro`,`autor`)

values( '1', '2');

insert into Libro_Autor_Version_2 (`libro`,`autor`)

values( '2', '1');

insert into Libro_Autor_Version_2 (`libro`,`autor`)

values( '3', '3');



Vamos a modificar en el fichero orm.xml la entidad Libro para apuntar a esta nueva tabla:


... <entity name = "Libro" class = "Libro">

<attributes>

<id name = "id">

<generated-value strategy = "AUTO" />

</id>

<basic name = "titulo" />

<basic name = "isbn" />

<many-to-one name="categoria">

<join-column referenced-column-name="id" name="categoriaId"/>

</many-to-one>

<many-to-one name="socio">

<join-column name="socioId" referenced-column-name="id"/>

</many-to-one>

<many-to-many name="autores">

<join-table name="Libro_Autor_Version_2">

<join-column name="libro" referenced-column-name="id" />

<inverse-join-column name="autor" referenced-column-name="id" />

</join-table>

</many-to-many>

</attributes>

</entity>

... 



Arrancamos e invocamos a la aplicación, y comprobaremos que efectivamente, prevalece la información del descriptor:




Y podemos ver, que efectivamente la aplicación muestra los datos de la nueva tabla, que son incorrectos.

En el próximo tutorial de la saga empezaremos a usar algunos componentes de icefaces (listados, paginación, etc...) usando como modelo de negocio todo esto que hemos montado con EJB 3.0.

A continuación puedes evaluarlo:

Regístrate para evaluarlo

Por favor, vota +1 o compártelo si te pareció interesante

Share |
Anímate y coméntanos lo que pienses sobre este TUTORIAL: