En esta unidad vamos a realizar ejercicios relativos a las validaciones.
Siguiendo el Ejercicio01 de la unidad anterior , pero eliminado todo el código relativo a las consultas, vamos a realizar las siguientes tareas.
Siempre que sea posible deberemos definir las validaciones usando el estándar JSR 303: Bean Validation.
De la clase NIF
[XYZ0-9][0-9]{7}[TRWAGMYFPDXBNJZSQVHLCKE]
”String letras = "TRWAGMYFPDXBNJZSQVHLCKE"; int valor; if (nif.startsWith("X")) { //Es un NIE valor=Integer.parseInt(nif.substring(1,nif.length()-1)); }else if (nif.startsWith("Y")) { //Es un NIE valor=10000000+Integer.parseInt(nif.substring(1,nif.length()-1)); }else if (nif.startsWith("Z")) { //Es un NIE valor=20000000+Integer.parseInt(nif.substring(1,nif.length()-1)); } else { //Es un NIF valor=Integer.parseInt(nif.substring(0,nif.length()-1)); } String letraCorrecta=""+letras.charAt(valor % 23); if (nif.endsWith(letraCorrecta)==true) { //El NIF es correcto } else { //El NIF es erroneo }
De la clase Enfermedades
:
true
más de tres enfermedades.true
la propiedad alergia
la propiedad nombreAlergia
no puede ser null
ni ser únicamente espacios.
De la clase Coberturas
true
la propiedad fecundacionInVitro
si el sexo es Mujer
.
De la clase Seguro
:
nif
debe ser válidonombre
no puede estar vacioape1
no puede estar vacionif
debe ser válidoenfermedades
debe ser válidocoberturas
debe ser válidoedad
debe ser mayor que 0.edad
está entre 0 y 17 años deberá indicar que no es posible ser menor de edad para hacer un seguro.sexo
no puede ser null
.numHijos
no puede ser menor que 0.numHijos
no puede ser mayor que 0 si casado
es false
. (Es un poco machista pero es por hacer validaciones con distintos campos a la vez embarazada
no puede ser true
si el sexo es Hombre
.
De la clase AsistenciaMedica
:
breveDescripcion
no puede estar vacio.lugar
no puede estar vacio.explicacion
no puede estar vacio.tipoAsistencia
no puede ser null.fecha
no puede ser null.hora
no puede ser null.importe
no puede ser null.importe
debe tener 10 dígitos enteros y 2 decimales.importe
debe ser mayor que cero.De todas las clases:
Hasta ahora todas nuestras clases han tenido únicamente métodos de set/get
y los métodos de validación. Pero ésto nos puede llevar al antipatrón del modelo anémico. Con este antipatrón lo que hacemos es tener dominios sin lógica y toda ella se pone en una capa superior llamada “Capa de servicio (Service Layer)”.
Ya hemos cambiado un poco nuestro modelo para hacerlo menos anémico al añadirle todas las validaciones pero vayamos ahora más allá y organicemos los métodos de las clases para incluir más lógica en nuestras clases.
De todas las clases:
setId….
?. Debemos eliminarlos todos.Dejamos los getId…
ya que son útiles para saber cuál es la clave primaria. get/set
( Usar el atributo access=“field”
que se explica en Fichero de mapeo ''.hbm.xml'' ). Ésto lo deberemos hacer en todas las propiedades de todos nuestras entidades ya que así seremos libres de quitar los get/set
que queramos.
De la clase NIF
:
getNumero()
que nos retorna sólo el número del NIF. (En los NIE se debe incluir tambien su letra inicial).getLetra()
que nos retorna sólo la letra final del NIF/NIEboolean isNIE()
que nos retorne true
si el NIF es un NIE. Sabemos que es un NIF si empiza por un número. Y es un NIE si empieza por alguna de las letras “X” , “Y” o “Z”.
Vemos cómo hemos alimentado 1) la clase NIF
que aparentemente no era muy útil hasta ahora. Es decir, hemos añadido lógica a nuestro modelo.
La siguiente tarea a realizar es añadir un campo a la clase Seguro
para que calcule automáticamente la fecha de creación del seguro. Para ello deberemos incluir un “listener” para que rellene el campo.
En la clase Main
deberemos añadir este código.
SimpleDateFormat sdfFecha = new SimpleDateFormat("dd/MM/yyyy"); sdfFecha.setLenient(false); SimpleDateFormat sdfHora = new SimpleDateFormat("HH:mm:ss"); sdfHora.setLenient(false); Seguro seguro = new Seguro("65234857A", "Santiago", "Sanz", "López", 23, Sexo.Hombre, false, 1, false, new Coberturas(false, true, false), new Enfermedades(true, false, true, false, null)); AsistenciaMedica asistenciaMedica1 = new AsistenciaMedica(seguro, "Golpe en el brazo", "Madrid", "Fractura del radio derecho de la mano debido a golpe contundente con el suelo. Se escayola el brazo", TipoAsistencia.Hospitalaria, sdfFecha.parse("31/12/2013"), sdfHora.parse("11:21:45"), new BigDecimal("700.31")); AsistenciaMedica asistenciaMedica2 = new AsistenciaMedica(seguro, "Fiebre alta", "Alzira", "El paciente presenta cuadro alto de fiabre con deficultad para respirar. Se recetan antibioticos.", TipoAsistencia.Ambulatoria, sdfFecha.parse("27/02/2013"), sdfHora.parse("12:34:16"), new BigDecimal("81.14")); seguro.getAsistenciasMedicas().add(asistenciaMedica1); seguro.getAsistenciasMedicas().add(asistenciaMedica2); session = sessionFactory.openSession(); try { session.beginTransaction(); session.save(seguro); session.getTransaction().commit(); } catch (javax.validation.ConstraintViolationException cve) { session.getTransaction().rollback(); System.out.println("No se ha podido insertar el seguro debido a los siguientes errores:"); for (ConstraintViolation constraintViolation : cve.getConstraintViolations()) { System.out.println("En el campo '" + constraintViolation.getPropertyPath() + "':" + constraintViolation.getMessage()); } } catch (org.hibernate.exception.ConstraintViolationException cve) { session.getTransaction().rollback(); System.out.println("No se ha podido insertar el seguro debido al siguiente error:"); System.out.println("El valor ya existe." + cve.getLocalizedMessage()); }
Este ejercicio es optativo.
Seguro
no se tenga ninguna referencia a clases , interfaces ,etc de Hibernate. Es decir que no haya referencia al interfaz PreInsertEventListener ni a nada más de Hibernate.