@@ -103,7 +103,7 @@ se encargará de propagar la operación en cascada.
103103
104104.. caution :: En SQLite la integridad referencial está deshabilitada por defecto.
105105
106- .. rubric :: Hibernate
106+ .. rubric :: |JPA|
107107
108108.. caution :: Por lo general, las operaciones en cascada se definen de padre a
109109 hijo cuando las relaciones son bidireccionales. Cuando las relaciones son
@@ -353,9 +353,130 @@ Tanto en |JPQL| como en *Criteria API*, los *JOIN* a secas respetan este
353353comportamiento derivado de las anotaciones, mientras que los *FETCH JOIN *
354354fuerzan siempre la carga inmediata.
355355
356+ .. _xml-orm-mapping :
357+
358+ Mapeo mediante archivos
359+ =======================
360+ Aunque, como ya hemos visto, el mapeo puede realizarse mediante :ref: `anotaciones al
361+ propio código de las clases del modelo <orm-mapping>`, también es posible no
362+ añadir las anotaciones al código Java y crear archivos |XML | aparte que
363+ sustituyan por completo a estas anotaciones. Para entender cómo crear estos
364+ archivos es indispensable que entendamos que las anotaciones eran de dos
365+ naturalezas distintas:
366+
367+ * Las que definían propiamente el esquema (como ``@Id `` o ``@Colum ``).
368+ * Las que incorporaban restricciones a los valores (como ``@Positive ``).
369+
370+ En los archivos ambas deben realizarse por separado, así que las trataremos bajo
371+ epígrafes distintos:
372+
373+ Definición del esquema
374+ ----------------------
375+ Antes de crear el archivo para *definir el esquema * debemos indicar en la
376+ configuración de la unidad de persistencia definida en
377+ :file: `META-INF/persistence.xml ` cuál será tal archivo:
378+
379+ .. code-block :: xml
380+
381+ <persistenceo-unit name =" MiUnidadP" transaction-type =" RESOURCE_LOCAL" >
382+ <!-- Pueden definirse varios <mapping-file> -->
383+ <mapping-file >META-INF/schema.xml</mapping-file >
384+
385+ <!-- ... -->
386+
387+ <!-- Es bastante probable que no necesitemos declarar las clases con <class> -->
388+
389+ </presistence-unit >
390+
391+ Hecho lo cual, podemos definir :file: `META-INF/schema.xml ` con la definición del
392+ esquema:
393+
394+ .. literalinclude :: files/schema.xml
395+ :class: toggle
396+ :caption: Definición del esquema SQL
397+ :language: xml
398+
399+ En el archivo se ha definido una relación *unidirección *. Podríamos hacerla
400+ *bidireccional * descomentando las líneas correspondientes en la definición de la
401+ entidad padre (aunque deberíamos haber definido el atributo ``estudiantes `` en
402+ la clase ``Centro ``).
403+
404+ Definición de restricciones
405+ ---------------------------
406+ Para definir restricciones **a nivel de aplicación ** debemos escribir el archivo
407+ ``META-INF/validation ``:
408+
409+ .. code-block :: xml
410+ :emphasize-lines: 9
411+
412+ <?xml version =" 1.0" encoding =" UTF-8" ?>
413+ <validation-config
414+ xmlns =" http://xmlns.jcp.org/xml/ns/validation/configuration"
415+ xmlns : xsi =" http://www.w3.org/2001/XMLSchema-instance"
416+ xsi : schemaLocation =" http://xmlns.jcp.org/xml/ns/validation/configuration
417+ http://xmlns.jcp.org/xml/ns/validation/validation-configuration-2.0.xsd"
418+ version =" 2.0" >
419+
420+ <!-- Podemos añadir más elementos <constraint-mapping> para repartir
421+ la configuración en varios archivos. -->
422+ <constraint-mapping >META-INF/constraints.xml</constraint-mapping >
423+ </validation-config >
424+
425+ Los archivos donde propiamente se definen las restricciones tienen esta pinta:
426+
427+ .. code-block :: xml
428+ :caption: Restricciones a nivel de aplicación
429+ :class: toggle
430+
431+ <?xml version =" 1.0" encoding =" UTF-8" ?>
432+ <constraint-mappings
433+ xmlns =" http://xmlns.jcp.org/xml/ns/validation/mapping"
434+ xmlns : xsi =" http://www.w3.org/2001/XMLSchema-instance"
435+ xsi : schemaLocation =" http://xmlns.jcp.org/xml/ns/validation/mapping
436+ http://xmlns.jcp.org/xml/ns/validation/validation-mapping-2.0.xsd"
437+ version =" 2.0" >
438+ <bean class =" edu.acceso.ejemplo.modelo.Centro" ignore-annotations =" true" >
439+ <field name =" nombre" >
440+ <constraint annotation =" jakarta.validation.constraints.NotNull" >
441+ <message >El nombre no puede ser nulo</message >
442+ </constraint >
443+ <constraint annotation =" jakarta.validation.constraints.Size" >
444+ <message >El nombre debe tener entre 2 y 100 caracteres</message >
445+ <element name =" min" >2</element >
446+ <element name =" max" >100</element >
447+ </constraint >
448+ </field >
449+ <field name =" titularidad" >
450+ <constraint annotation =" jakarta.validation.constraints.NotNull" >
451+ <message >La titularidad debe estar definida</message >
452+ </constraint >
453+ </field >
454+ </bean >
455+
456+ <bean class =" edu.acceso.ejemplo.modelo.Estudiante" ignore-annotations =" true" >
457+ <field name =" nombre" >
458+ <constraint annotation =" jakarta.validation.constraints.NotNull" >
459+ <message >El nombre no puede ser nulo</message >
460+ </constraint >
461+ </field >
462+ <field name =" centro" >
463+ <constraint annotation =" jakarta.validation.constraints.NotNull" >
464+ <message >El centro no puede ser nulo</message >
465+ </constraint >
466+ </field >
467+ </bean >
468+ </constraint-mappings >
469+
470+ Podemos definir otras restricciones:
471+
472+ * ``jakarta.validation.constraints.Positive ``
473+ * ``jakarta.validation.constraints.PositiveOrZero ``
474+ * etc.
475+
356476.. |JPQL | replace :: :abbr: `JPQL ( Java Persistence Query Language ) `
357477.. |SGBD | replace :: :abbr: `SGBD ( Sistema Gestor de Bases de Datos ) `
358478.. |ORM | replace :: :abbr: `ORM ( Object-Relational Mapping ) `
359479.. |JPA | replace :: :abbr: `JPA ( Java Persistence API ) `
360480.. |SQL | replace :: :abbr: `SQL ( Structured Query Language ) `
481+ .. |XML | replace :: :abbr: `XML ( eXtensible Markup Language ) `
361482.. _Hibernate : https://hibernate.org/
0 commit comments