Iniciando con Java e Hibernate
Como muchos ya sabrán Hibernate es una herramienta de mapeo objeto-relacional, lo puedes ver en Wikipedia y encontrarás todo lo relacionado con la definición de esta herramienta.
En lo que vamos a centrarnos es en explicar a detalle las principales anotaciones que usa Hibernate para realizar el mapeo ya sea desde entidades a tablas o viceversa.
Deben tener en cuenta que Hibernate trabaja tanto con sus anotaciones del paquete org.hibernate.annotations como también con anotaciones JPA del paquete javax.persistence, por lo general yo recomiendo usar el segundo ya que por si algún motivo deseas cambiar de herramienta te resultará mucho más facil ya que JPA esta presenta en todas las herramientas de mapeo objeto-relacional para JAVA.
Como primer punto necesitamos conocer las siguientes anotaciones básicas para iniciar con el desarrollo:
- @Column especifica la columna asignada para una propiedad o campo persistente, tiene los siguientes atributos opcionales:
- columnDefinition el fragmento de SQL que se utiliza para generar la columna en la base de datos, por lo general se usa cuando Hibernate va a crear las tablas (String).
- insertable si la columna puede usar la sentencia INSERT, es decir si se puede insertar datos en esa columna (boolean).
- length la longitud de la columna, útil en columnas de tipo VARCHAR (int).
- name el nombre de la columna en la base de datos (String).
- nullable si la columna puede ser nula o no (boolean).
- precision la precisión de una columna decimal, es decir el numero total de digitos de la columna (int).
- scale el numero de dígitos despues de la coma o punto decimal se usa generalmente junto con el atributo precision (int).
- table el nombre de la tabla que contiene la columna (String).
- unique si la columna debe tener valores únicos que no se pueden repetir (boolean).
- updatable si la columna puede usar la sentencia UPDATE, es decir si se puede actualizar los datos en esa columna (boolean).
- @Entity es una anotación obligatoria, lo único que hace es declarar a la clase como una entidad, es decir una clase POJO persistente, tiene un atributo opcional:
- name el nombre de la entidad utilizado por JPA para referirse a la misma en las consultas; por defecto el propio nombre de la clase (String).
- @GeneratedValue proporciona la especificación de estrategias de generación para los valores de claves primarias.
- generator el nombre del generador de claves principal que se utiliza generalmente con la anotación TableGenerator y SequenceGenerator (String).
- strategy la estrategia para generar la clave primaria
- GenerationType.AUTO elige una estrategia adecuada para que la base de datos en particular genere una clave única.
- GenerationType.IDENTITY asigna claves primarias para la entidad usando una columna de identidad de base de datos.
- GenerationType.SEQUENCE asigna claves primarias para la entidad usando una secuencia de base de datos.
- GenerationType.TABLE asigna claves primarias para la entidad usando una tabla de base de datos subyacente para asegurar la unicidad.
- @Id especifica la llave primaria de la entidad.
- @Inheritance especifica la estrategia de herencia que se utilizará para una jerarquía de clases de entidad, es decir si existe una clase (entidad) que derive de otra como cliente y persona; tiene el siguiente atributo:
- strategy la estrategia que se utilizará para la jerarquía de herencia de entidades.
- InheritanceType.JOINED una estrategia en la que los campos que son específicos de una subclase se asignan a una tabla separada de los campos que son comunes a la clase principal, y se realiza una combinación para instanciar la subclase, es decir se crea tablas separadas para cada entidad que extiende de otra, teniendo como llave primaria y a su vez foránea el id de la clase principal.
- InheritanceType.SINGLE_TABLE crea una sola tabla de todas las clases uniendo todos sus atributos en una sola, con un campo llamado dtype en la tabla de la base de datos, este tipo esta por defecto si no se le agrega la anotación @Inheritance a la clase principal.
- InheritanceType.TABLE_PER_CLASS crea una tabla separada por cada entidad con todos los atributos tanto de la clase principal como los propios de la subclase.
- @JoinColumn especifica una columna para unirse a una asociación de entidad o colección de elementos.
- columnDefinition el fragmento de SQL que se utiliza para generar la columna en la base de datos, por lo general se usa cuando Hibernate va a crear las tablas (String).
- foreignKey se utiliza para especificar o controlar la generación de una restricción de clave externa cuando la generación de tablas está en vigor.
- insertable Si la columna está incluida en declaraciones SQL INSERT generadas por el proveedor de persistencia(boolean).
- name el nombre que tendrá la llave foránea en la base de datos (String).
- nullable si puede ser nula o no la columna (boolean).
- referencedColumnName el nombre de la columna a la que hace referencia esta columna de clave externa (String).
- table el nombre de la tabla que contiene la columna (String).
- unique si la columna debe ser única que no se pueda repetir la llave (boolean).
- updatable si la columna está incluida en las sentencias UPDATE de SQL generadas por el proveedor de persistencia (boolean).
- @ManyToOne especifica una asociación de un solo valor a otra clase de entidad que tiene multiplicidad de muchos a uno, es decir existen varias instancias de la entidad que pertenece a una.
- cascade las relaciones entre entidades a menudo dependen de la existencia de otra entidad, por ejemplo, la relación Persona - Dirección . Sin la Persona , la entidad Dirección no tiene ningún significado propio. Cuando eliminamos la entidad Persona , nuestra entidad Dirección también debería eliminarse.
- CascadeType.ALL propaga todas las operaciones, incluidas las específicas de JPA, de una entidad principal a una secundaria.
- CascadeType.DETACH la operación de separación elimina la entidad del contexto persistente. Cuando usamos CascaseType.DETACH, la entidad secundaria también se eliminará del contexto persistente.
- CascadeType.MERGE la operación de combinación copia el estado del objeto dado en el objeto persistente con el mismo identificador. CascadeType.MERGE propaga la operación de combinación de una entidad principal a una secundaria.
- CascadeType.PERSIST la operación de persistencia hace que una instancia transitoria sea persistente. CascadeType.PERSIST propaga la operación persistencia de un padre a una entidad secundaria . Por ejemplo cuando guardamos la entidad de persona , la entidad de dirección también se guardará.
- CascadeType.REFRESH las operaciones de actualización releen el valor de una instancia determinada de la base de datos . En algunos casos, podemos cambiar una instancia después de persistir en la base de datos, pero luego necesitamos deshacer esos cambios. En ese tipo de escenario, esto puede resultar útil. Cuando usamos esta operación con CascadeType.REFRESH , la entidad secundaria también se vuelve a cargar desde la base de datos cada vez que se actualiza la entidad principal.
- CascadeType.REMOVE Como sugiere el nombre, la operación de eliminación elimina la fila correspondiente a la entidad de la base de datos y también del contexto persistente.
- fetch si la asociación debe cargarse de forma diferida o debe buscarse de inmediato.
- FetchType.EAGER los datos se traen desde la base de datos en el momento en que la clase principal lo hace también.
- FetchType.LAZY los datos se obtienen desde la base de datos cuando son requeridos, es decir los datos no se cargan conjuntamente con la clase padre; esto puede mejorar el rendimiento ya que no siempre tenemos los datos cargados en memoria.
- optional si la asociación es opcional (boolean).
- targetEntity la clase de entidad que es el objetivo de la asociación (Class).
- @OneToMany especifica una asociación de varios valores con multiplicidad de uno a varios, es decir que la entidad posee varios de otra por lo general una lista.
- cascade las relaciones entre entidades a menudo dependen de la existencia de otra entidad, por ejemplo, la relación Persona - Dirección . Sin la Persona , la entidad Dirección no tiene ningún significado propio. Cuando eliminamos la entidad Persona , nuestra entidad Dirección también debería eliminarse.
- CascadeType.ALL propaga todas las operaciones, incluidas las específicas de JPA, de una entidad principal a una secundaria.
- CascadeType.DETACH la operación de separación elimina la entidad del contexto persistente. Cuando usamos CascaseType.DETACH, la entidad secundaria también se eliminará del contexto persistente.
- CascadeType.MERGE la operación de combinación copia el estado del objeto dado en el objeto persistente con el mismo identificador. CascadeType.MERGE propaga la operación de combinación de una entidad principal a una secundaria.
- CascadeType.PERSIST la operación de persistencia hace que una instancia transitoria sea persistente. CascadeType.PERSIST propaga la operación persistencia de un padre a una entidad secundaria . Por ejemplo cuando guardamos la entidad de persona , la entidad de dirección también se guardará.
- CascadeType.REFRESH las operaciones de actualización releen el valor de una instancia determinada de la base de datos . En algunos casos, podemos cambiar una instancia después de persistir en la base de datos, pero luego necesitamos deshacer esos cambios. En ese tipo de escenario, esto puede resultar útil. Cuando usamos esta operación con CascadeType.REFRESH , la entidad secundaria también se vuelve a cargar desde la base de datos cada vez que se actualiza la entidad principal.
- CascadeType.REMOVE Como sugiere el nombre, la operación de eliminación elimina la fila correspondiente a la entidad de la base de datos y también del contexto persistente.
- fetch si la asociación debe cargarse de forma diferida o debe buscarse de inmediato.
- FetchType.EAGER los datos se traen desde la base de datos en el momento en que la clase principal lo hace también.
- FetchType.LAZY los datos se obtienen desde la base de datos cuando son requeridos, es decir los datos no se cargan conjuntamente con la clase padre; esto puede mejorar el rendimiento ya que no siempre tenemos los datos cargados en memoria.
- mappedBy el campo al que pertenece la relación (String).
- orphanRemoval si se aplica la operación de eliminación a las entidades que se han eliminado de la relación y si se conecta en cascada la operación de eliminación a esas entidades (boolean).
- targetEntity la clase de entidad que es el objetivo de la asociación (Class).
- @OneToOne especifica una asociación de un solo valor a otra entidad que tiene multiplicidad uno a uno.
- cascade las relaciones entre entidades a menudo dependen de la existencia de otra entidad, por ejemplo, la relación Persona - Dirección . Sin la Persona , la entidad Dirección no tiene ningún significado propio. Cuando eliminamos la entidad Persona , nuestra entidad Dirección también debería eliminarse.
- CascadeType.ALL propaga todas las operaciones, incluidas las específicas de JPA, de una entidad principal a una secundaria.
- CascadeType.DETACH la operación de separación elimina la entidad del contexto persistente. Cuando usamos CascaseType.DETACH, la entidad secundaria también se eliminará del contexto persistente.
- CascadeType.MERGE la operación de combinación copia el estado del objeto dado en el objeto persistente con el mismo identificador. CascadeType.MERGE propaga la operación de combinación de una entidad principal a una secundaria.
- CascadeType.PERSIST la operación de persistencia hace que una instancia transitoria sea persistente. CascadeType.PERSIST propaga la operación persistencia de un padre a una entidad secundaria . Por ejemplo cuando guardamos la entidad de persona , la entidad de dirección también se guardará.
- CascadeType.REFRESH las operaciones de actualización releen el valor de una instancia determinada de la base de datos . En algunos casos, podemos cambiar una instancia después de persistir en la base de datos, pero luego necesitamos deshacer esos cambios. En ese tipo de escenario, esto puede resultar útil. Cuando usamos esta operación con CascadeType.REFRESH , la entidad secundaria también se vuelve a cargar desde la base de datos cada vez que se actualiza la entidad principal.
- CascadeType.REMOVE Como sugiere el nombre, la operación de eliminación elimina la fila correspondiente a la entidad de la base de datos y también del contexto persistente.
- fetch si la asociación debe cargarse de forma diferida o debe buscarse de inmediato.
- FetchType.EAGER los datos se traen desde la base de datos en el momento en que la clase principal lo hace también.
- FetchType.LAZY los datos se obtienen desde la base de datos cuando son requeridos, es decir los datos no se cargan conjuntamente con la clase padre; esto puede mejorar el rendimiento ya que no siempre tenemos los datos cargados en memoria.
- mappedBy el campo al que pertenece la relación (String).
- optional si la asociación es opcional (boolean).
- orphanRemoval si se aplica la operación de eliminación a las entidades que se han eliminado de la relación y si se conecta en cascada la operación de eliminación a esas entidades (boolean).
- targetEntity la clase de entidad que es el objetivo de la asociación (Class).
- @Table especifica la tabla principal de la entidad anotada, es decir en esta anotación puedes especificar el nombre real de la tabla en la base de datos, tiene los siguientes atributos:
- catalog el catálogo (contiene información sobre la estructura de la tabla, ficheros, tipo, formato y restricciones de almacenamiento de cada dato) de la tabla (String).
- indexes índices que contiene la tabla para una búsqueda más rápida y ordenada de datos (Index).
- schema por defecto public pero puedes definir cualquier otro esquema que hayas creado en la base de datos (String).
- uniqueConstraints especifica las columnas que no se pueden repetir dentro de la tabla (UniqueConstraint).
Comentarios
Publicar un comentario