- Usar Data Transfer Objects (DTO): POJOs que se utilicen para enviar información desde la capa de persistencia a la de servicio haciendo mapeos en ambos sentidos o
- Definir el mapeo de persistencia (ORM) del mismo tipo que se usa en el servicio usando configuración por XML.
Usuario
de la entrada anterior.Lo primero es comentar las anotaciones que usamos para marcar la entidad (
@Entity
) y su clave primaria (@Id
). En este momento si ejecutamos nos dirá que no existe una entidad gestionada para el tipo Usuario
:
java.lang.IllegalArgumentException: Not a managed type: class es.lanyu.usuarios.repositorios.Usuario
Eso ocurre porque al intentar crear el bean para
UsuarioDAO
no es capaz de encontrar la definición de entidad para el tipo variable que le hemos pasado (Usuario
):
Error creating bean with name 'usuarioDAO': Invocation of init method failed
Vamos entonces a definir por XML lo que hemos comentado. Lo haremos en un fichero con el nombre
Usuario.orm.xml
que pondremos en nuestros resources
dentro de una carpeta nueva que llamaremos jpa
:<?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.usuarios.repositorios.Usuario" access="FIELD">
<table name="USUARIOS"/>
<attributes>
<id name="nombre">
<!-- <generated-value strategy="IDENTITY"/> -->
<column length="16"/>
</id>
<basic name="correo" optional="false" />
</attributes>
</entity>
</entity-mappings>
Este fichero utiliza una definición que no habíamos usado hasta ahora y tiene que ver con JPA, no con Spring Framework. Ahí está definida la etiqueta entity
.Para nuestro caso identificamos la etiqueta
entity
y su atributo class
con el valor de la clase Usuario
con la anotación @Entity
comentado.Por otro lado identificamos la etiqueta
id
, y su atributo name
con valor nombre
, dentro de la etiqueta attributes
con la anotación @Id
comentada.Esta información es necesaria igual que vimos en el caso de las anotaciones ya que para guardar un objeto debe ser de una clase de entidad y poseer un campo que sirva de clave primaria.
El resto de campos no son necesarios añadirlos ya que por defecto serán guardados en la BD si no están marcados como
transient
igual que pasaba con la serialización en Java nativo. Para esto y para añadir otra información de persistencia a un campo se utiliza la etiqueta basic
. En nuestro caso lo añadimos para obligar que el campo tenga un valor con optional="false"
.NOTA: Haz la prueba y mira en H2 cómo están definidos los cambios. Luego borrar la tabla (
DROP TABLE USUARIOS
) y ejecútalo comentando el campo correo y mira la diferencia en la tabla (NOT NULL
vs NULL
).Fíjate que he puesto un elemento
table
indicando el nombre de la tabla (USUARIOS
), de esta forma nos guardará los usuarios en esa nueva tabla y podremos compararla con la tabla USUARIO
. Si no ponemos nada le pondrá el nombre de la entidad como pasó con las anotaciones y de ahí salió nuestra tabla USUARIO
. La traducción a anotación de este elemento table es @Table
.Ahora tenemos que decirle a nuestra aplicación que lo incluya, para eso lo añadimos a nuestra configuración en XML. ¿Sabréis decir dónde está?
En el fichero
resources/config/jpa-config.xml
Puedes encontrar el código hasta aquí en su repositorio y ver el vídeo del webinar:
En la siguiente entrada veremos cómo hacer esto con clases que tienen superclases.
No hay comentarios:
Publicar un comentario