unidades:04_claves_primarias_y_tipos_datos:04_enumerados
no way to compare when less than two revisions
Diferencias
Muestra las diferencias entre dos versiones de la página.
— | unidades:04_claves_primarias_y_tipos_datos:04_enumerados [2023/04/07 21:26] (actual) – creado - editor externo 127.0.0.1 | ||
---|---|---|---|
Línea 1: | Línea 1: | ||
+ | ====== Enumerados ====== | ||
+ | En este tema vamos a ver cómo persistir los tipo enumerados. | ||
+ | Hibernate no soporta directamente el persistir los enumerados pero, gracias a sus potentes mecanismos de extensión, es muy sencillo persistir un enumerado. | ||
+ | |||
+ | |||
+ | ===== Clases Java ===== | ||
+ | Antes de entrar en cómo se implementa en Hibernate , veamos las clases Java que vamos a usar: | ||
+ | * Clase '' | ||
+ | * Enumerado '' | ||
+ | |||
+ | <code java 1> | ||
+ | public enum TipoFuncionario { | ||
+ | Carrera, | ||
+ | Practicas, | ||
+ | Interino | ||
+ | } | ||
+ | |||
+ | public class Profesor implements Serializable | ||
+ | | ||
+ | private int id; | ||
+ | private String nombre; | ||
+ | private String ape1; | ||
+ | private String ape2; | ||
+ | private TipoFuncionario tipoFuncionario; | ||
+ | |||
+ | public Profesor(){ | ||
+ | } | ||
+ | |||
+ | public Profesor(int id, String nombre, String ape1, String ape2, TipoFuncionario tipoFuncionario) { | ||
+ | this.id = id; | ||
+ | this.nombre = nombre; | ||
+ | this.ape1 = ape1; | ||
+ | this.ape2 = ape2; | ||
+ | this.tipoFuncionario = tipoFuncionario; | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | En las líneas de la 1 a la 5 se ha creado el enumerado '' | ||
+ | |||
+ | <note important> | ||
+ | |||
+ | En el siguiente diagrama UML se ve la relación entre '' | ||
+ | |||
+ | |||
+ | <uml> | ||
+ | class Profesor | ||
+ | Profesor : int id | ||
+ | Profesor : String nombre | ||
+ | Profesor : String ape1 | ||
+ | Profesor : String ape2 | ||
+ | |||
+ | |||
+ | class TipoFuncionario << | ||
+ | TipoFuncionario : Carrera | ||
+ | TipoFuncionario : Practicas | ||
+ | TipoFuncionario : Interino | ||
+ | |||
+ | |||
+ | Profesor | ||
+ | </ | ||
+ | |||
+ | ===== Tablas ===== | ||
+ | La tablas de base de datos quedarían de la siguiente forma: | ||
+ | |||
+ | <uml> | ||
+ | class Profesor << | ||
+ | Profesor : INTEGER id | ||
+ | Profesor : VARCHAR nombre | ||
+ | Profesor : VARCHAR ape1 | ||
+ | Profesor : VARCHAR ape2 | ||
+ | Profesor : INTEGER tipoFuncionario | ||
+ | </ | ||
+ | |||
+ | Podemos apreciar que en el diseño de la tabla de la base de datos se ha añadido una columna de tipo '' | ||
+ | |||
+ | ===== Fichero de mapeo '' | ||
+ | Al persistir la clase será necesario un único fichero de persistencia: | ||
+ | * '' | ||
+ | |||
+ | ==== Profesor.hbm.xml ==== | ||
+ | El fichero '' | ||
+ | |||
+ | <code xml 1| Fichero Profesor.hbm.xml> | ||
+ | <?xml version=" | ||
+ | < | ||
+ | < | ||
+ | <class name=" | ||
+ | <id column=" | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | | ||
+ | < | ||
+ | <type name=" | ||
+ | <param name=" | ||
+ | <param name=" | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | El fichero incluye el nuevo tag '' | ||
+ | |||
+ | === Tag type === | ||
+ | El tag ''< | ||
+ | == Atributos == | ||
+ | |||
+ | * **name**: | ||
+ | == Tag anidados == | ||
+ | * **param**: Este tag se usa para indicarle a la clase Java <javadoc h41> | ||
+ | * enumClass: El valor del ''< | ||
+ | * type: El valor del ''< | ||
+ | |||
+ | < | ||
+ | ¿Qué significa que en el parámetro '' | ||
+ | La clase Java <javadoc jdk7> | ||
+ | |||
+ | En la siguiente tabla podemos ver los tipos SQL que soportan el parámetro '' | ||
+ | |||
+ | ^ Valor numérico ^ Tipo SQL ^ Forma de persistencia ^ | ||
+ | | 4 |Types.INTEGER| Se almacena el **ordinal** del enumerado | | ||
+ | | 2 |Types.NUMERIC| Se almacena el **ordinal** del enumerado | | ||
+ | | 5 |Types.SMALLINT| Se almacena el **ordinal** del enumerado | | ||
+ | | -6 |Types.TINYINT| Se almacena el **ordinal** del enumerado | | ||
+ | | -5 |Types.BIGINT| Se almacena el **ordinal** del enumerado | | ||
+ | | 3 |Types.DECIMAL| Se almacena el **ordinal** del enumerado | | ||
+ | | 8 |Types.DOUBLE| Se almacena el **ordinal** del enumerado | | ||
+ | | 6 |Types.FLOAT| Se almacena el **ordinal** del enumerado | | ||
+ | | 1 |Types.CHAR| Se almacena el **nombre** del enumerado | | ||
+ | | -16 |Types.LONGVARCHAR| Se almacena el **nombre** del enumerado | | ||
+ | | 12 |Types.VARCHAR| Se almacena el **nombre** del enumerado | | ||
+ | |||
+ | Es decir, que si usamos una columna de tipo numérica como por ejemplo '' | ||
+ | |||
+ | <param name=" | ||
+ | |||
+ | En ese caso el valor que se guardará es un número correspondiente al orden que ocupa el valor del enumerado al definirlo. | ||
+ | En nuestro ejemplo el enumerado | ||
+ | |||
+ | ^ Valor del Enumerado ^ Valor guardado en la base de datos ^ | ||
+ | | Carrera | ||
+ | | Practicas | ||
+ | | Interino | ||
+ | |||
+ | Mientras que si usamos una columna de tipo alfanumérico como por ejemplo '' | ||
+ | |||
+ | <param name=" | ||
+ | | ||
+ | En ese caso el valor que se guardará es el nombre del propio enumerado. | ||
+ | En nuestro ejemplo el enumerado | ||
+ | |||
+ | ^ Valor del Enumerado ^ Valor guardado en la base de datos ^ | ||
+ | | Carrera | ||
+ | | Practicas | ||
+ | | Interino | ||
+ | </ | ||
+ | ===== Anotaciones ===== | ||
+ | Para usar anotaciones deberemos modificar el código fuente de las clases Java y **no** usar los ficheros '' | ||
+ | |||
+ | El código fuente de la clase '' | ||
+ | |||
+ | <code java 1| Clase Profesor anotada > | ||
+ | @Entity | ||
+ | @Table(name=" | ||
+ | public class Profesor implements Serializable | ||
+ | | ||
+ | @Id | ||
+ | @Column(name=" | ||
+ | private int id; | ||
+ | | ||
+ | @Column(name=" | ||
+ | private String nombre; | ||
+ | | ||
+ | @Column(name=" | ||
+ | private String ape1; | ||
+ | | ||
+ | @Column(name=" | ||
+ | private String ape2; | ||
+ | | ||
+ | @Enumerated(EnumType.ORDINAL) | ||
+ | private TipoFuncionario tipoFuncionario; | ||
+ | |||
+ | public Profesor(){ | ||
+ | } | ||
+ | |||
+ | public Profesor(int id, String nombre, String ape1, String ape2, TipoFuncionario tipoFuncionario) { | ||
+ | this.id = id; | ||
+ | this.nombre = nombre; | ||
+ | this.ape1 = ape1; | ||
+ | this.ape2 = ape2; | ||
+ | this.tipoFuncionario = tipoFuncionario; | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Podemos ver cómo en la línea 18 se ha incluido la anotación '' | ||
+ | |||
+ | * **@Enumerated**: | ||
+ | * **EnumType** Este atributo indica cómo se debe persistir en la base de datos el enumerado. Sus posible valores son: | ||
+ | * ORDINAL: Se almacenará en la base de datos el **ordinal** del enumerado. | ||
+ | * STRING: Se almacenará en la base de datos el **nombre** del enumerado. | ||
+ | |||
+ | < | ||
+ | ===== Código Java ===== | ||
+ | Ahora que ya tenemos preparadas la clase Java para que pueda persistirse veamos el código necesario para persistirla. | ||
+ | |||
+ | <code java 1|Persistiendo la clase Profesor> | ||
+ | Profesor profesor=new Profesor(412, | ||
+ | |||
+ | Session session=sessionFactory.openSession(); | ||
+ | session.beginTransaction(); | ||
+ | |||
+ | session.save(profesor); | ||
+ | |||
+ | session.getTransaction().commit(); | ||
+ | session.close(); | ||
+ | </ | ||
+ | |||
+ | Como podemos ver, el usar enumerados no añade ningún tipo de complejidad al código Java que se usa. |
unidades/04_claves_primarias_y_tipos_datos/04_enumerados.txt · Última modificación: 2023/04/07 21:26 por 127.0.0.1