String
). En esta entrada vamos a ver cómo hacer ORM por XML de una clase con herencia usando la etiqueta mapped-superclass
.Para ello vamos a usar la clase
Participante
del proyecto datos-deportivos
que es bastante simple aunque no es un POJO pues hereda de AbstractNombrable
(y pertenece a otra librería). En definitiva se trata de usar la API de JPA para definir la relación entre los campos de nuestro objeto de negocio (incluidos los declarados en la superclase) y columnas de nuestras tablas de la BD.Para ello hay que estudiar cómo se define la clase participante. No dispone de ningún campo propio: sólo tiene
identificador
y nombre
pero pertenecen a las clases IdentificableString
y AbstractNombrable
respectivamente.Vamos a añadir a nuestra carpeta
resources/jpa
los archivos IdentificableString.orm.xml
:<?xml version="1.0" encoding="UTF-8"?>
<entity-mappings 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
http://java.sun.com/xml/ns/persistence/orm_1_0.xsd"
version="1.0">
<mapped-superclass class="es.lanyu.commons.identificable.IdentificableString"
access="FIELD">
<attributes>
<id name="id" />
</attributes>
</mapped-superclass>
</entity-mappings>
Y AbstractNombrable.orm.xml
:<?xml version="1.0" encoding="UTF-8"?>
<entity-mappings 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
http://java.sun.com/xml/ns/persistence/orm_1_0.xsd"
version="1.0">
<mapped-superclass class="es.lanyu.commons.identificable.AbstractNombrable"
access="FIELD">
<attributes>
<basic name="nombre" optional="false" />
</attributes>
</mapped-superclass>
</entity-mappings>
De esta forma ya tenemos definido cómo se persisten las clases de las que hereda. En esta ocasión no se usa la etiqueta entity
como se va a seguir usando en Participante
sino que usamos mapped-superclass
para las superclases que no son entidades. Con esta etiqueta vamos a definir el mapeo de todo lo que es común al resto de entidades que hereden. Si nos fijamos cada superclase tiene definidos sus propios campos.Sólo nos quedaría añadir el archivo con al mapeo de
Participante
, Participante.orm.xml
:<?xml version="1.0" encoding="UTF-8"?>
<entity-mappings 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
http://java.sun.com/xml/ns/persistence/orm_1_0.xsd"
version="1.0">
<entity class="es.lanyu.participante.Participante" access="FIELD">
<table name="PARTICIPANTES"/>
<!-- <attributes>
<id name="id">
<generated-value strategy="IDENTITY"/>
</id>
<basic name="nombre" optional="false">
<column length="32"/>
</basic>
</attributes>-->
</entity>
</entity-mappings>
Una vez definido el mapeo nos toca añadir el DAO correspondiente con las operaciones para Participante
, con lo que nos creamos el sencillo PanticipanteDAO
en el paquete es.lanyu.participante.repositorios
. ¿Sabes crear el código por tí mismo?package es.lanyu.participante.repositorios;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import es.lanyu.participante.Participante;
@Repository
public interface ParticipanteDAO extends JpaRepository {}
Y no hay que olvidarse de añadir el escaneo de este repositorio a nuestra configuración (añadimos otro elemento
jpa:repositories
). ¿Sabes dónde hay que añadirlo?
En el fichero
resources/config/jpa-config.xml
Puedes encontrar el código hasta aquí en su repositorio y ver el video del webinar:
Te propongo como ejercicio que cargues todos los participantes que están en el fichero
participantes.json
en la BD programando lo que haga falta para leerlos (leyendo línea a línea cogiendo las que tienen datos y descartando las líneas de comentarios), persearlo con jackson (desde una línea con datos parsearla a Participante
usando el bean ObjectMapper
, ojo que hay un campo que habrá que ignorar - hashcode
- usando un MixIn
) y luego guardarlo con ParticipanteDAO.save
. Finalmente imprime por el log con nivel TRACE
los participantes que recuperes que tengan en su nombre la palabra "Real"
(definir método con la query en DAO). Deben verse por consola (modificando el nivel de log correspondiente en propiedades).Inténtalo a ver hasta donde llegas y, si no lo acabas o quieres compararla con otra solución, puedes ver el siguiente vídeo:
No hay comentarios:
Publicar un comentario