unidades:06_objetos_validaciones:03_columna_unica
Diferencias
Muestra las diferencias entre dos versiones de la página.
— | unidades:06_objetos_validaciones:03_columna_unica [2023/04/07 21:26] (actual) – creado - editor externo 127.0.0.1 | ||
---|---|---|---|
Línea 1: | Línea 1: | ||
+ | ====== Columnas únicas ====== | ||
+ | En lecciones anteriores hemos tratado el tema de las claves primarias pero aún no habíamos explicado cómo validar que una columna es única. El [[http:// | ||
+ | Para validar que una columna es única mediante el fichero de mapeo de Hibernate '' | ||
+ | |||
+ | <code xml 1|Usuario.hbm> | ||
+ | <?xml version=" | ||
+ | < | ||
+ | < | ||
+ | <class name=" | ||
+ | <id column=" | ||
+ | < | ||
+ | </id> | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | En la línea 8 podemos ver el atributo '' | ||
+ | |||
+ | Si queremos hacer ésto mismo usando notaciones es tan sencillo como añadir el atributo '' | ||
+ | |||
+ | <code java > | ||
+ | @Column(name=" | ||
+ | private String login; | ||
+ | </ | ||
+ | |||
+ | Desgraciadamente ésto no es suficiente para que nuestra columna sea única. También deberemos hacer que la base de datos cree el índice con la columna única. Afortunadamente Hibernate posee una herramienta que nos genera todo el esquema de la base de datos como un Script de SQL para nuestra base de datos. | ||
+ | |||
+ | Si ejecutamos el siguiente código Java se generará en el raíz de nuestro proyecto el fichero '' | ||
+ | <code java> | ||
+ | new org.hibernate.tool.hbm2ddl.SchemaExport(configuration).setOutputFile(" | ||
+ | </ | ||
+ | |||
+ | <note important> | ||
+ | Es esta línea de Java la que crea el Script SQL con la columna única. Siendo entonces la base de datos la encargada de comprobar la unicidad de la columna y **no** siendo Hibernate el encargado de hacerlo. | ||
+ | </ | ||
+ | |||
+ | <note tip> | ||
+ | Por supuesto posteriormente será necesario ejecutar el script manualmente contra la base de datos usando phpMyAdmin o cualquier otra herramienta. | ||
+ | </ | ||
+ | <note warning> | ||
+ | También podemos hacer que Hibernate lance automáticamente el script contra la base de datos poniendo el segundo parámetro del método '' | ||
+ | </ | ||
+ | |||
+ | |||
+ | ===== org.hibernate.exception.ConstraintViolationException ===== | ||
+ | |||
+ | El siguiente paso con las columnas únicas es tratar con la excepción que se lanzará cuando se intente insertar un valor que ya existe en la columna. La excepción que se lanza es <javadoc h41> | ||
+ | |||
+ | El código ahora para persistir una clase quedará así: | ||
+ | <code java 1> | ||
+ | Usuario usuario = new Usuario(" | ||
+ | |||
+ | try { | ||
+ | session.beginTransaction(); | ||
+ | |||
+ | session.save(usuario); | ||
+ | |||
+ | session.getTransaction().commit(); | ||
+ | } catch (javax.validation.ConstraintViolationException cve) { | ||
+ | session.getTransaction().rollback(); | ||
+ | System.out.println(" | ||
+ | for (ConstraintViolation constraintViolation : cve.getConstraintViolations()) { | ||
+ | System.out.println(" | ||
+ | } | ||
+ | } catch (org.hibernate.exception.ConstraintViolationException cve) { | ||
+ | session.getTransaction().rollback(); | ||
+ | System.out.println(" | ||
+ | System.out.println(" | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Vemos cómo se han añadido las líneas de las 15 a la 19 para tratar la nueva excepción <javadoc h41> | ||
+ | |||
+ | Debido a que las 2 excepciones tienen el mismo nombre de clase ,'' | ||
+ | |||
+ | El último problema que nos encontramos es que Hibernate no nos indica en la excepción cuál ha sido la propiedad que ha fallado, así que no nos queda más remedio que usar el mensaje de la excepción mediante <javadoc jdk7> | ||
+ | Duplicate entry ' | ||
+ | | ||
+ | <note tip> | ||
+ | La última opción que nos queda es analizar el mensaje | ||
+ | Duplicate entry ' | ||
+ | para obtener el nombre de la columna '' | ||
+ | </ |