Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

ejercicios:unidad06 [2012/10/31 09:22]
admin [Validaciones]
ejercicios:unidad06 [2016/07/03 20:02] (actual)
Línea 6: Línea 6:
  
 ==== Validaciones ==== ==== Validaciones ====
-Las siguientes  validaciones seguirán es estándar JSR 303: Bean Validation:+Siempre que sea posible deberemos definir las validaciones  usando el estándar JSR 303: Bean Validation.
  
 === NIF === === NIF ===
-En la clase ''NIF''+De la clase ''NIF'' 
 +  * Que el NIF sea único para cada seguro. Es decir que no puede haber 2 seguros con el mismo NIF
   * Valida que el NIF tenga un tamaño de 9 caracteres.   * Valida que el NIF tenga un tamaño de 9 caracteres.
   * Valida que el NIF siga la expresión regular : "''[XYZ0-9][0-9]{7}[TRWAGMYFPDXBNJZSQVHLCKE]''"   * Valida que el NIF siga la expresión regular : "''[XYZ0-9][0-9]{7}[TRWAGMYFPDXBNJZSQVHLCKE]''"
Línea 39: Línea 40:
  
 </code> </code>
 +=== Enfermedades ===
 +De la clase ''Enfermedades'':
 +  * No es posible que estén a ''true'' más de tres enfermedades.
 +  * Si está a ''true'' la propiedad ''alergia'' la propiedad ''nombreAlergia'' no puede ser ''null'' ni ser únicamente espacios.
  
-=== CodigoCuentaCliente === +=== Coberturas === 
-En la clase ''CodigoCuentaCliente'': +De la clase ''Coberturas'' 
-  * Valida que el Codigo Cuenta Cliente tenga un tamaño de 20 caracteres. +  * Solo se puede ser ''true'' la propiedad ''fecundacionInVitro'' si el sexo es ''Mujer''
-  * Valida que el Codigo Cuenta Cliente siga la expresión regular : "''[0-9]{20}''+
-  * Haz un método que valide si el DC de CodigoCuentaCliente es correcto.Haz que el mensaje sea "El DC del Codigo Cuenta Cliente no es correcto". La siguiente función calcula el valor correcto: +
-  * <code java> +
-private String getDCCorrecto(String banco,String sucursal,String cuenta) { +
-    int dc1=0; +
-  +
-    dc1=dc1+Integer.parseInt(banco.substring(0,1))*4; +
-    dc1=dc1+Integer.parseInt(banco.substring(1,2))*8; +
-    dc1=dc1+Integer.parseInt(banco.substring(2,3))*5; +
-    dc1=dc1+Integer.parseInt(banco.substring(3,4))*10; +
-    dc1=dc1+Integer.parseInt(sucursal.substring(0,1))*9; +
-    dc1=dc1+Integer.parseInt(sucursal.substring(1,2))*7; +
-    dc1=dc1+Integer.parseInt(sucursal.substring(2,3))*3; +
-    dc1=dc1+Integer.parseInt(sucursal.substring(3,4))*6;    +
-  +
-    dc1=dc1 %11; +
-    dc1=11-dc1; +
-    if (dc1==10) { +
-        dc1=1; +
-    } +
-    if (dc1==11) { +
-        dc1=0; +
-    }     +
-  +
-    int dc2=0; +
-  +
-    dc2=dc2+Integer.parseInt(cuenta.substring(0,1))*1; +
-    dc2=dc2+Integer.parseInt(cuenta.substring(1,2))*2; +
-    dc2=dc2+Integer.parseInt(cuenta.substring(2,3))*4; +
-    dc2=dc2+Integer.parseInt(cuenta.substring(3,4))*8; +
-    dc2=dc2+Integer.parseInt(cuenta.substring(4,5))*5; +
-    dc2=dc2+Integer.parseInt(cuenta.substring(5,6))*10; +
-    dc2=dc2+Integer.parseInt(cuenta.substring(6,7))*9; +
-    dc2=dc2+Integer.parseInt(cuenta.substring(7,8))*7; +
-    dc2=dc2+Integer.parseInt(cuenta.substring(8,9))*3; +
-    dc2=dc2+Integer.parseInt(cuenta.substring(9,10))*6;     +
-  +
-  +
-    dc2=dc2 %11; +
-    dc2=11-dc2; +
-    if (dc2==10) { +
-        dc2=1; +
-    } +
-    if (dc2==11) { +
-        dc2=0; +
-    }     +
-  +
-    String dc=String.valueOf(dc1)+String.valueOf(dc2); +
-  +
-    return dc; +
-+
-</code>+
  
-=== Domicilio === +=== Seguro === 
-En la clase ''Domicilio'': +De la clase ''Seguro'': 
-  * El campo ''tipoVia'' no puede estar vacio +  * El campo ''nif'' debe ser válido
-  * El campo ''nombreVia'' no puede estar vacio +
-  * El campo ''poblacion'' no puede estar vacio +
-  * El campo ''provincia'' no puede estar vacio +
-  * El campo ''codigoPostal'' no puede estar vacio +
-  * El campo ''codigoPostal'' debe seguir la expresión regular "''[0-9]{5}''" +
- +
-=== Cliente === +
-En la clase ''Cliente'':+
   * El campo ''nombre'' no puede estar vacio   * El campo ''nombre'' no puede estar vacio
   * El campo ''ape1'' no puede estar vacio   * El campo ''ape1'' no puede estar vacio
-  * El campo ''fechaNacimiento'' no puede estar vacio 
-  * El campo ''fechaNacimiento'' debe ser menor que hoy 
   * El campo ''nif'' debe ser válido   * El campo ''nif'' debe ser válido
-  * El campo ''domicilio'' debe ser válido +  * El campo ''enfermedades'' debe ser válido 
-  * El campo ''cuentas'' debe ser válido +  * El campo ''coberturas'' debe ser válido 
-  * El campo ''correoElectronico'' debe tener el formato de un correo electrónico +  * El campo ''edad'' debe ser mayor que 0. 
-  * El campo ''telefonoFijo'' debe seguir la expresión regular "''[0-9]{9}''" +  * Si campo ''edad'' está entre 0 y 17 años deberá indicar que no es posible ser menor de edad para hacer un seguro. 
-  * El campo ''telefonoMovil'' debe seguir la expresión regular "''[0-9]{9}''" +  * El campo ''sexo'' no puede ser ''null''. 
-  * El campo ''nif'' debe ser único+  * El campo ''numHijos'' no puede ser menor que 0. 
 +  * El campo ''numHijos'' no puede ser mayor que si ''casado'' es ''false''. (Es un poco machista pero es por hacer validaciones con distintos campos a la vez :-( ). 
 +  * El campo ''embarazada'' no puede ser ''true'' si el sexo es ''Hombre''. 
  
-=== Cuenta === 
-En la clase ''Cuenta'': 
-  * El campo ''ccc'' debe ser válido 
-  * El campo ''saldo'' debe tener 10 dígitos enteros y 2 decimales. 
-  * El campo ''titulares'' debe ser válido 
-  * El campo ''movimientos'' debe ser válido 
-  * El campo ''ccc'' debe ser único 
  
-=== Movimiento === +=== AsistenciaMedica === 
-En la clase ''Movimiento'': +De la clase ''AsistenciaMedica'': 
-  * El campo ''tipoMovimiento'' no puede estar vacio.+  * El campo ''breveDescripcion'' no puede estar vacio
 +  * El campo ''lugar'' no puede estar vacio. 
 +  * El campo ''explicacion'' no puede estar vacio. 
 +  * El campo ''tipoAsistencia'' no puede ser null. 
 +  * El campo ''fecha'' no puede ser null. 
 +  * El campo ''hora'' no puede ser null. 
 +  * El campo ''importe'' no puede ser null.
   * El campo ''importe'' debe tener 10 dígitos enteros y 2 decimales.   * El campo ''importe'' debe tener 10 dígitos enteros y 2 decimales.
 +  * El campo ''importe'' debe ser mayor que cero.
  
 === Todas === === Todas ===
-En todas las clases:+De todas las clases:
   * Personaliza los mensajes de la anotación @NotNull para que en vez de ser "no puede ser null" sea "No puede estar vacío".   * Personaliza los mensajes de la anotación @NotNull para que en vez de ser "no puede ser null" sea "No puede estar vacío".
  
Línea 143: Línea 88:
  
 === Todas  === === Todas  ===
-En todas las clases:+De todas las clases:
   * No debería poder establecerse la clave primaria de ninguna clase. Es decir, si ya la genera Hibernate , ¿para qué hay un método ''setId....''?. Debemos eliminarlos todos.Dejamos los ''getId...'' ya que son útiles para saber cuál es la clave primaria. \\ Al quitar estos métodos se generará un error de que no los encuentra. La solución a este problema es hacer que Hibernate acceda directamente a las propiedades sin usar los métodos ''get/set'' ( Usar el atributo ''access="field"'' que se explica en  [[unidades:02_hibernate:02_entidad#fichero_de_mapeo_hbmxml|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.   * No debería poder establecerse la clave primaria de ninguna clase. Es decir, si ya la genera Hibernate , ¿para qué hay un método ''setId....''?. Debemos eliminarlos todos.Dejamos los ''getId...'' ya que son útiles para saber cuál es la clave primaria. \\ Al quitar estos métodos se generará un error de que no los encuentra. La solución a este problema es hacer que Hibernate acceda directamente a las propiedades sin usar los métodos ''get/set'' ( Usar el atributo ''access="field"'' que se explica en  [[unidades:02_hibernate:02_entidad#fichero_de_mapeo_hbmxml|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.
  
 === NIF === === NIF ===
-En la clase ''NIF'': +De la clase ''NIF'': 
-  * Eliminar el método ''setNIF'' ya que no es necesario puesto que se asigna con el constructor. +  * Añadir un método llamado ''getNumero()'' que nos retorna sólo el número del NIF. (En los NIE se debe incluir tambien su letra inicial). 
-  * Añadir un método llamado ''getNumero()'' que nos retorna sólo el número del NIF +  * Añadir un método llamado ''getLetra()'' que nos retorna sólo la letra final del NIF/NIE 
-  * Añadir un método llamado ''getLetra()'' que nos retorna sólo la letra del NIF +  * Añadir un método llamado ''boolean 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".
-  * Añadir un método llamado ''boolean isNIE()'' que nos retorne ''true'' si el NIF es un NIE.+
  
-=== CodigoCuentaCliente === +Vemos cómo hemos //alimentado// (( lo contrario de estar anémico ))  la clase ''NIF''  que aparentemente no era muy útil hasta ahoraEs decirhemos añadido lógica a nuestro modelo.
-En la clase ''CodigoCuentaCliente'' +
-  * Eliminar el método ''setCcc'' ya que no es necesario puesto que se asigna con el constructor. +
-  * Añadir un método llamado ''getBanco()'' que nos retorna el código del banco. ''ccc.substring(0,4)'' +
-  * Añadir un método llamado ''getSucursal()'' que nos retorna el código del banco. ''ccc.substring(4, 8)'' +
-  * Añadir un método llamado ''getCuenta'' que nos retorna el código del banco''ccc.substring(1020)'' +
-  * Añadir un método llamado ''getDC()'' que nos retorna el código del banco''ccc.substring(8, 10)''+
  
-Vemos cómo hemos //alimentado// (( lo contrario de estar anémico )) a las clases ''NIF'' y ''CodigoCuentaCliente'' que aparentemente no eran muy útiles hasta ahora. Es decir, hemos añadido lógica a nuestro modelo. +=== Seguro === 
-=== Cuenta === +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.
-La siguiente tarea a realizar es la de modificar el saldo de la cuenta a medida que se añaden Movimientos. +
-  * Eliminar el método ''setSaldo'' ya que ahora se modificará internamente al añadir los movimientos. +
-  * Vamos a hacer que los movimientos sólo se puedan añadir y ver pero nunca modificar o borrar. Para ello haremos lo siguientes cambios: +
-    * En el método ''getMovimientos()'' retornar una lista que no se puede modificar usando el método ''Collections.unmodifiableList(movimientos)'' +
-    * Borrar el método ''setMovimientos()'' +
-    * Añadir el método ''void addMovimiento(Movimiento movimiento)'' en el que añadiremos el movimiento a la lista pero tambien modificaremos el valor del saldo , sumando o restando el valor del importe al saldo según la propiedad ''tipoMovimiento''.+
  
-=== Movimiento === 
-En la clase ''Movimiento'' 
-  * Añadir un listener en el evento PreInsert para que se establezca automáticamente el valor de hoy en el campo ''fecha'' . 
-  * Eliminar todos los métodos ''set...'' de la clase ''Movimiento'' para evitar que se pueda cambiar algo de un movimiento. 
  
  
-Con todo ésto ya hemos finalizado el cambio del modelo para hacerlo mucho menos anémico. 
  
 === Main === === Main ===
-En la clase ''Main'' deberemos añadir este código que contiene los cambios en los movimientos.+En la clase ''Main'' deberemos añadir este código.
 <code java> <code java>
-Date fechaNacimiento (new GregorianCalendar(1980, 8, 1)).getTime();+        SimpleDateFormat sdfFecha = new SimpleDateFormat("dd/MM/yyyy")
 +        sdfFecha.setLenient(false); 
 +        SimpleDateFormat sdfHora = new SimpleDateFormat("HH:mm:ss")
 +        sdfHora.setLenient(false);
  
-Cliente cliente1 = new Cliente("Carlos", "Valero", "Giner", fechaNacimiento, new NIF("56765456F")"963767876"null, "cvalero@gmail.com"null, new Domicilio(TipoVia.Plaza"Plaza del Ayuntamiento""12""6""Valencia""Valencia""46178")); +        Seguro seguro = new Seguro("65234857A", "Santiago", "Sanz", "López", 23Sexo.Hombrefalse, 1, false, new Coberturas(falsetruefalse)new Enfermedades(truefalsetrue, falsenull)); 
-Cliente cliente2 = new Cliente("Pilar", "Peris", "Cantó", fechaNacimientonew NIF("47678765H"), "963345656", null, "pperis@gmail.com", null, new Domicilio(TipoVia.Calle, "Calle Garrido", "6", "23", "Cheste", "Valencia", "46896")); +        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.HospitalariasdfFecha.parse("31/12/2013"), sdfHora.parse("11:21:45")new BigDecimal("700.31")); 
-Cuenta cuenta = new Cuenta(new CodigoCuentaCliente("57651209916549873456"), new BigDecimal("1000")); +        AsistenciaMedica asistenciaMedica2 = new AsistenciaMedica(seguro, "Fiebre alta", "Alzira", "El paciente presenta cuadro alto de fiabre con deficultad para respirar. Se recetan antibioticos.", TipoAsistencia.AmbulatoriasdfFecha.parse("27/02/2013")sdfHora.parse("12:34:16"), new BigDecimal("81.14")); 
-cuenta.getTitulares().add(cliente1); +        seguro.getAsistenciasMedicas().add(asistenciaMedica1); 
-cuenta.getTitulares().add(cliente2); +        seguro.getAsistenciasMedicas().add(asistenciaMedica2);
-cuenta.addMovimiento(new Movimiento(TipoMovimiento.Debe, new BigDecimal("100"), new Date(), "Compra en la carnicería")); +
-cuenta.addMovimiento(new Movimiento(TipoMovimiento.Haber, new BigDecimal("20"), new Date(), "Devolución de los pañales en el supermercado")); +
-try { +
-    session.beginTransaction();+
  
-    session.save(cuenta); +        session = sessionFactory.openSession(); 
- +        try { 
-    session.getTransaction().commit(); +            session.beginTransaction(); 
-} catch (javax.validation.ConstraintViolationException cve) { +            session.save(seguro); 
-    session.getTransaction().rollback(); +            session.getTransaction().commit(); 
-    System.out.println("No se ha podido insertar la cuenta debido a los siguientes errores:"); +        } catch (javax.validation.ConstraintViolationException cve) { 
-    for (ConstraintViolation constraintViolation : cve.getConstraintViolations()) { +            session.getTransaction().rollback(); 
-        System.out.println("En el campo '" + constraintViolation.getPropertyPath() + "':" + constraintViolation.getMessage()); +            System.out.println("No se ha podido insertar el seguro debido a los siguientes errores:"); 
-    +            for (ConstraintViolation constraintViolation : cve.getConstraintViolations()) { 
-} catch (org.hibernate.exception.ConstraintViolationException cve) { +                System.out.println("En el campo '" + constraintViolation.getPropertyPath() + "':" + constraintViolation.getMessage()); 
-    session.getTransaction().rollback(); +            
-    System.out.println("No se ha podido insertar la cuenta debido al siguiente error:"); +        } catch (org.hibernate.exception.ConstraintViolationException cve) { 
-    System.out.println("El valor ya existe." + cve.getLocalizedMessage()); +            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()); 
 +        }
 </code> </code>
- 
-Al ejecutar el código podremos ver en la base de datos cómo el saldo de la cuenta ''57651209916549873456'' es de 920€ 
  
 ===== Ejercicio02 Optativo ===== ===== Ejercicio02 Optativo =====
 Este ejercicio es optativo. Este ejercicio es optativo.
  
-  * Modifica el Ejercicio01 de esta misma unidad para hacer que al implementar el listener en la clase ''Movimiento'' no se tenga ninguna referencia a clases , interfaces ,etc de Hibernate. Es decir que no haya referencia al interfaz <javadoc h41>org.hibernate.event.spi.PreInsertEventListener|PreInsertEventListener</javadoc> ni a nada más de Hibernate. +  * Modifica el Ejercicio01 de esta misma unidad para hacer que al implementar el listener en la clase ''Seguro'' no se tenga ninguna referencia a clases , interfaces ,etc de Hibernate. Es decir que no haya referencia al interfaz <javadoc h41>org.hibernate.event.spi.PreInsertEventListener|PreInsertEventListener</javadoc> ni a nada más de Hibernate.
- +
-===== Ejercicio03 Optativo ===== +
-Este ejercicio es optativo. +
- +
-Modifica el Ejercicio01 de esta misma unidad para hacer que se puedan obtener todos los clientes de forma paginada para ello deberás modificar la clase DAO. +
- +
-Puedes utilizar las clases que prefieras pero una posible solución sería la siguiente: +
-<uml> +
-note "Clase Generica con Tipo T" as N1 +
-class Pages +
-Pages: List<T> getPage(in numPage) +
-Pages: int getNumPages() +
- +
-class ClientePages +
- +
-class ClienteDAO +
-ClienteDAO : ClientePages findAllPaginated() +
- +
-N1 .. Pages +
-Pages <.. ClientePages +
  
  
-ClienteDAO -> ClientePages 
-</uml> 
ejercicios/unidad06.1351671744.txt.gz · Última modificación: 2016/07/03 20:16 (editor externo)
Ir hasta arriba
CC Attribution-Noncommercial-Share Alike 3.0 Unported
chimeric.de = chi`s home Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0